[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 メーリングリストの案内