[pgsql-jp: 36611] Re: duplication エラー(UNICODE文字列)
Tatsuo Ishii
ishii @ sraoss.co.jp
2006年 1月 11日 (水) 22:18:59 JST
石井です.
> 以下のようなエラーが発生しており、大変悩んでおります。
>
> ◆ 再現手順
> (1) UNICODE で createdb
> $ createdb -E UNICODE testdb
>
> (2) 以下のSQLを実行
>
> -------------------------------------------
> DROP INDEX "tb_str_key";
> DROP TABLE "tb";
>
> CREATE TABLE "tb" (
> "pid" integer NOT NULL,
> "str" character varying(30) NOT NULL,
> Constraint "tb_pkey" Primary Key ("pid")
> );
>
>
> COPY "tb" FROM stdin;
> 12345 ONE
> 6789 BBB
> \.
>
> CREATE UNIQUE INDEX tb_str_key ON tb USING btree (str);
> -------------------------------------------
> ※ 上記、全角文字「ONE」と「BBB」はUTF-8文字列。
> ※ http://k5ito.hp.infoseek.co.jp/data/duplicate.sql.txt からDownload可能です。
>
> (3) エラー発生。UNIQUE INDEX が作成できない。
> ERROR: Cannot create unique index. Table contains non-unique values
>
> ◆ 詳細
> o 上記のSQLは pg_dump でダンプしたものであり、UNIQUE
> INDEXがある状態で、テーブルに格納されておりました。(Postgresql 7.2.1)
> サンプルデータとしてかなり簡素化してありますが、肝となる部分(ONE、BBB)はそのまま引用してあります。
>
> o UTF-8 の「ONE」と「BBB」をバイナリエディタで参照したところ、それぞれ、
> ONE --- EF BC AF EF BC AE EF BC A5
> BBB --- EF BC A2 EF BC A2 EF BC A2
> でありました。3 * n バイト目が違っているだけで、あとは同じです。
> それが原因なのでしょうか?
>
> o 上記(1)〜(3)をVersion 7.2.1とVersion 8.1.0 で実行したところNGでした。
>
> インデックスの作成の仕方が誤りなのでしょうか?しかし、今まで正常にテーブルに格納されていたことが腑に落ちません。
そのデータをダウンロードして試してみましたが,問題ありませんでした
(PostgreSQL 8.1.1).
おそらくロケールの問題でしょう.initdbのときに,initdb --no-locale ...
とロケールなしにしてますか?日本語を使うなら必須ですよ.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgsql-jp メーリングリストの案内