2006/11/11
PostgreSQLを使用したデータベースで、7.2.3 で稼動しているシステムを 7.4.3 にアップグレードする事になった。 
このシステムは、日本語、英語、中国語、各語混在の4種類のデータベースが動作しており、それらをすべてアップグレードする必要がある。 
各データベースは、どれも姑息な構成にはなっていないので、7.2.3 で pg_dump し、7.4.3 で psql を使ってリストアすればいい。 
…はずだったのだが、うまくいかない。 
日本語、英語は EUC_JP、中国語はEUC_CN でデータベースが生成してあるのだが、これらについては問題なくリストアができた。 
各語混在はUNICODEでデータベースを生成してあるのだが、なぜかうまくいかない。 
こんな現象が発生する。 
たとえば、以下のようなテーブルがあったとして…。 
----- 
CREATE TABLE HOGE 
( 
  VALUE TEXT PRIMARY KEY 
); 
----- 
このように INSERT してみる。 
----- 
INSERT INTO HOGE VALUES ('あいうえお'); 
INSERT INTO HOGE VALUES ('かきくけこ'); 
----- 
すると、こんなエラーが発生する。 
# 実際に、この文字列の INSERT でエラーが発生するということではない。 
# こういう現象が発生するという意味。 
----- 
ERROR:  duplicate key violates unique constraint "value_pkey" 
----- 
VALUE列に同じ文字列を挿入するなら、もちろん、このエラーが発生するが、上記データで発生するわけがない。 
なぜだ? 
ググってみる。 
あった。 
 PostgreSQL7.3インストール編 
「UNICODEでのみ問題が出る」という記載ではないが、日本語を正しく処理させるためには、ロケールの設定をオフにしないといけないようだが、7.3 以降はデフォルトでオンになっているらしい。 
initdb --no-locale してから、同様の操作を行ってみると、エラーも出ずにすんなり INSERT する事ができた。 
う~ん、こんな落とし穴があったとは…。 
 
 
 
 
投稿者 zunbe : 2006/11/11 00:09:41 
 
	| 
	トラックバック
	 | 
	
	〔http://blog.zunbe.com/mt/mt-tb.cgi/505〕
	 | 
 
 
 
 
 
 |