いやあ、ついつい忘れてしまうんで、今回はブログに書いておこう。
(PostgreSQL 使いとしては今更なネタだけど(^^;)
さっき、うちのテスト用のマシン(FreeBSD 8.1-RELEASE on ASUS EeePC 4G-X(笑))で、プログラムの試験用に新しい DB 作ろうとしたんだけど(DBMS は PostgreSQL 9.0.1)、
%createdb hoge_db -E EUC_JPcreatedb: database creation failed: ERROR: new encoding (EUC_JP) is incompatible with the encoding of the template database (UTF8)HINT: Use the same encoding as in the template database, or use template0 as template.
って怒られた。
このマシンの DB のディフォルトの文字コードは UTF-8 なんだから、EUC-JP で新しい DB 作ろうとしても駄目やでぇってこと。
PostgreSQL の createdb は、実際には template1 という空の DB をコピーして新しい DB を作成する。
で、この template1 という DB には initdb した時に指定した文字コード情報が登録されているのだ。
だから、「UTF-8 の文字コードを使う DB をコピーして、EUC-JP の文字コードを使う DB は作れんでぇ」と怒られてる。
じゃあ、どうすればいいか?・・・だが、エラーメッセージに HINT として示されているように、template0 を使えば良いわけね。
template0 は、文字コードの情報を持っていない、本当にピュアな DB なので、他の文字コードの DB の元ネタになるってわけだね。
これは PostgreSQL 8.4 からの仕様のようなので、昔 PostgreSQL 使ってて、最近復活したって人は絶対やらかしそうな失敗(笑)
(まあ、うちみたいに、色々なお客さんの色々な文字コードの DB を作ってテストする立場の人間でないと、違う文字コードの DB を作ることもあまりないのかもしれんが)
つーことで、
%createdb hoge_db --encoding=EUC-JP --template=template0CREATE DATABASE%psql --listList of databasesName | Owner | Encoding-----------+----------+----------hoge_db | postgres | EUC_JPpostgres | postgres | UTF8template0 | postgres | UTF8template1 | postgres | UTF8(4 rows)
で、バッチリOK!
コメントする