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