今日からCentOS6.2+PosgreSQL9.1.2の運用開始です。Solaris10+PosgreSQL8.1のダンプデータがあっさりリストアできたので、問題なく運用できるのかと思っていましたが、やはりトラブルが。
以前、PostgreSQL8.1のデータを8.2にリストアしようとして外字が原因でうまくいかなかったことがありました。
http://blog.goo.ne.jp/mach5481/e/02610f4f7031fbc9eddbe1ab2d10c4c6
http://blog.goo.ne.jp/mach5481/e/358bfa26b970fe8f4293254a9ac80c2a
その時はリストアそのものができなかったのですが、9.1.2ではリストアできるのですが、外字を含んだテーブルをAccessで表示させようとすると、文字バケしたり、ODBCエラーがでて、Accessが落ちてしまいます。やはりWindows95時代に登録した外字が原因です。
結局、上記ブログで書いたように
/usr/local/src/postgresql9.1.2/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
に外字の変換データを追加してmakeし直さなければなりませんでした。
一応、下記を追加しました。
{0xf5a1, 0xe282ac}
{0xf5a2, 0xe282ac}
{0xf5a3, 0xe282ac}
{0xf5a4, 0xe282ac}
{0xf5a5, 0xe282ac}
{0xf5a6, 0xe282ac}
{0xf5a7, 0xe282ac}
{0xf5a8, 0xe282ac}
{0xf5a9, 0xe282ac}
{0xf5aa, 0xe282ac}
{0xf5ab, 0xe282ac}
{0xf5ac, 0xe282ac}
{0xf5ad, 0xe282ac}
{0xf5ae, 0xe282ac}
外字をユーロ記号に変換しています。外字はミリリットルとかリットルなのですが、今となってはどのコードがミリリットルなのかわかりません。なので、全てユーロ記号に変換しました。実際、ユーロ記号が表示されていれば、それが何を意味していた外字だったか判断が付くので、その時々に直せば良いと思っています。
上記データを含んでmakeしなければならないのですが、以下その手順です。
-----------------------------------
既に一度、上記変換デーブルを含まない形でmakeしているものとして、2回目にmakeする場合の手順。
1./usr/local/src/postgresql9.1.2/src/backend/utils/mb/Unicode/euc_jp_to_utf8.mapの編集
EUC_JP側のコード順に上記データを追加。
2.postgresで
$ cd /usr/local/src/postgresql9.1.2/src
$ ./make unintall
$ ./make clear (これがないと、修正後の変換テーブルを参照しない)
$ ./configure
$ ./make all
$ ./make install
-----------------------------------
もし、一度もmakeしていない状態から行うなら、
euc_jp_to_utf8.map編集後、
$ cd /usr/local/src/postgresql9.1.2/src
$ ./configure (オプションなし)
$ ./make all
$ ./make install
環境設定を/home/postgre/.bashrcに追加
PATH="$PATH":/usr/local/pgsql/bin
export POSTGRE_HOME=/usr/local/pgsql
export PGLIB=$POSTGRE_HOME/lib
export PGDATA=$POSTGRE_HOME/data
(manは入っていなかったので省略)
$ source /home/potgre/.bashrc
$ initdb --encoding=EUC_JP --no-locale
後は自動起動設定、pg_hba.confの編集、postgresql.confの編集
-----------------------------------
今後、元データに外字コードが含まれているので、PostgreSQL更新時には必ず、上記作業が必要になります。
面倒なら、あっさりUTF8に移行するしかないのですが。
-----------------------------------
<続き> (2012/1/13)
今度はクライアント側でユーロ記号が含まれているレコードは更新できないというエラーが。
「UTF8の『0xe282ac』が変換できない!」と言ってきます。
PostgreSQLのmake時に「euc_jp_to_utf8.map」に外字を追加したように「utf8_to_euc_jp.map」に
{0xe282ac, 0xf5a1}
といったようなmapを追加してやらなければならないのかもしれません。
そのためには、また、また、データベースを止めてPostgreSQLのmakeをしなければならないのですが、そう止めてもいられないので、このODBCエラーが出た時は外字を一個づつ修正しています。
以前、PostgreSQL8.1のデータを8.2にリストアしようとして外字が原因でうまくいかなかったことがありました。
http://blog.goo.ne.jp/mach5481/e/02610f4f7031fbc9eddbe1ab2d10c4c6
http://blog.goo.ne.jp/mach5481/e/358bfa26b970fe8f4293254a9ac80c2a
その時はリストアそのものができなかったのですが、9.1.2ではリストアできるのですが、外字を含んだテーブルをAccessで表示させようとすると、文字バケしたり、ODBCエラーがでて、Accessが落ちてしまいます。やはりWindows95時代に登録した外字が原因です。
結局、上記ブログで書いたように
/usr/local/src/postgresql9.1.2/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
に外字の変換データを追加してmakeし直さなければなりませんでした。
一応、下記を追加しました。
{0xf5a1, 0xe282ac}
{0xf5a2, 0xe282ac}
{0xf5a3, 0xe282ac}
{0xf5a4, 0xe282ac}
{0xf5a5, 0xe282ac}
{0xf5a6, 0xe282ac}
{0xf5a7, 0xe282ac}
{0xf5a8, 0xe282ac}
{0xf5a9, 0xe282ac}
{0xf5aa, 0xe282ac}
{0xf5ab, 0xe282ac}
{0xf5ac, 0xe282ac}
{0xf5ad, 0xe282ac}
{0xf5ae, 0xe282ac}
外字をユーロ記号に変換しています。外字はミリリットルとかリットルなのですが、今となってはどのコードがミリリットルなのかわかりません。なので、全てユーロ記号に変換しました。実際、ユーロ記号が表示されていれば、それが何を意味していた外字だったか判断が付くので、その時々に直せば良いと思っています。
上記データを含んでmakeしなければならないのですが、以下その手順です。
-----------------------------------
既に一度、上記変換デーブルを含まない形でmakeしているものとして、2回目にmakeする場合の手順。
1./usr/local/src/postgresql9.1.2/src/backend/utils/mb/Unicode/euc_jp_to_utf8.mapの編集
EUC_JP側のコード順に上記データを追加。
2.postgresで
$ cd /usr/local/src/postgresql9.1.2/src
$ ./make unintall
$ ./make clear (これがないと、修正後の変換テーブルを参照しない)
$ ./configure
$ ./make all
$ ./make install
-----------------------------------
もし、一度もmakeしていない状態から行うなら、
euc_jp_to_utf8.map編集後、
$ cd /usr/local/src/postgresql9.1.2/src
$ ./configure (オプションなし)
$ ./make all
$ ./make install
環境設定を/home/postgre/.bashrcに追加
PATH="$PATH":/usr/local/pgsql/bin
export POSTGRE_HOME=/usr/local/pgsql
export PGLIB=$POSTGRE_HOME/lib
export PGDATA=$POSTGRE_HOME/data
(manは入っていなかったので省略)
$ source /home/potgre/.bashrc
$ initdb --encoding=EUC_JP --no-locale
後は自動起動設定、pg_hba.confの編集、postgresql.confの編集
-----------------------------------
今後、元データに外字コードが含まれているので、PostgreSQL更新時には必ず、上記作業が必要になります。
面倒なら、あっさりUTF8に移行するしかないのですが。
-----------------------------------
<続き> (2012/1/13)
今度はクライアント側でユーロ記号が含まれているレコードは更新できないというエラーが。
「UTF8の『0xe282ac』が変換できない!」と言ってきます。
PostgreSQLのmake時に「euc_jp_to_utf8.map」に外字を追加したように「utf8_to_euc_jp.map」に
{0xe282ac, 0xf5a1}
といったようなmapを追加してやらなければならないのかもしれません。
そのためには、また、また、データベースを止めてPostgreSQLのmakeをしなければならないのですが、そう止めてもいられないので、このODBCエラーが出た時は外字を一個づつ修正しています。