[pgsql-jp: 36609] duplication エラー(UNICODE文字列)

keigo ito keigo.ito @ gmail.com
2006年 1月 11日 (水) 20:07:35 JST


お世話になります。
伊藤と申します。

以下、FAQだとしたら申し訳ございません。

以下のようなエラーが発生しており、大変悩んでおります。

◆ 再現手順
(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でした。

インデックスの作成の仕方が誤りなのでしょうか?しかし、今まで正常にテーブルに格納されていたことが腑に落ちません。

DBサーバ筐体のリプレースに際して、非常に困っております。
どなたかご教授頂ければ幸いです。
よろしくお願いいたします。



pgsql-jp メーリングリストの案内