自宅のSolarisサーバーの電源が壊れてしまい、CentOSをインストールして別途、PostgreSQL8.2.5をインストールしてサーバーを新たに作ろうとしましたが、結局あきらめました。電源を購入して(約4000円)、以前から使用しているサーバーを修理しました。
(販売管理プログラムの修正が多くて、これ以上時間が作れないので新しいサーバーはまた、時間がある時に検討します。)
うまく動作しているように思ったPostgreSQLでしたが、
ODBC--呼び出しが失敗しました。
ERROR; character Oxf5a2 of encoding "EUC_JP" has no equivalent in "UTF8";
というエラーでてしまい。サーバーからうまくselectできません。
キャラクターコードの変換エラーなので、元々インストールされている、PostgreSQLのconfigure設定が悪いのかと思い、CentOSに最初から入っているPostgreSQLをアンインストールしました。
# pg_ctl stop
# yum remove postgresql
# userdel postgres
一応再起動して、Windowsパソコンからダウンロードしてきた、PostgreSQL8.2.5のソースコードをSamba経由でCentOSに持ってきます。インストールは
http://honana.com/postgresql/82/install.html
を参考にしました。
# useradd postgres
# passwd postgres
としておいて、/home/postgres/.bashrcにいつもの環境設定をします。
$ source /home/postgres/.bashrc
いつもの手順でソースコードを解凍してconfigureしますが、「readlineとzlibが無い」というエラーがでるので、
$ configure: error: readline library not found
# yum -y install readline-devel zlib-devel
としてネットワークインストールします。再度configureすると今度は問題なし。ソースファイルのディレクトリで
$ ./configure
$ make all
$ make install
$ initdb --no-locale --encoding=EUC_JP
$ createdb databasename
$ psql databasename -e <dump_data
これでうまくいくようなのですが、以前Solarisに移行した時も同じようなことがありましたが、EUC_JPの
0xff5e
0xf5a1
0xf5a2
が、UTF8に対しての変換マップがないようで、エラーが出ます。syslogの設定のよってはエラーがでませんが、CentOSのデフォルトのPostgreSQLではダンプデータ取込時に
$ psql databasename -e <dump_data > 1.txt
何てしてやると、画面にはエラーだけが表示されていました。./configureしてインストールした時はsyslogオプションを設定していなかったためか、あるいはその後confファイルを編集していないためか、エラーが画面表示されませんでした。結局、CentOSデフォルトのPostgreSQLと同様に./configureしたPostgreSQLも上記文字がマッピングからもれているために、Windowsの販売管理プログラムからテーブルを開いてやるとエラーがでてしまいます。
(CentOSに最初からインストールされているPostgreSQLもinitdb時にエンコードを指定してやるので、実は問題なかった。エラーの原因は文字変換マップにありました。)
エラーがでるのは取りあえずそのままにして、自動起動の設定を下記でします。
# install -o root -g root -m 755 /usr/local/src/postgresql-8.2.5/contrib/start-scripts/linux
/etc/rc.d/init.d/pgsql
# chkconfig --add pgsql
これまで自動起動のクリプトは、石井先生の「PostgreSQL完全攻略ガイド」中のコードを使用していましたが、今回はソースコードに含まれているものが使用します。
自動起動までこぎつけたものの、WindowsパソコンからODBC接続してテーブル(商品テーブル)を開くとエラーがでてしまいます。上記の3つ?の文字が変換できません。以前もこの3文字については他の文字に変換してからdumpしたような記憶があります。「~」となんだったかよく覚えていません。
このコード番号はEUCの一般的なマップには含まれていないようでした。定義されていない番号になっていました。LinuxでEUC_JPとして定義されているのでしょう。どの文字が該当するのかよくわかりません。
character 0xf5a1 of encoding "EUC_JP" has no equivalent in "UTF8"
というエラーなので、EUC_JPにあってUTF8に無いようなのですが。
ここに参考になる説明があります。
http://ml.postgresql.jp/pipermail/pgsql-jp/2004-September/017522.html
create conversionすれば良いようなのですが。
一応、変換テーブルに上記文字コードのマップを追加することも検討してみました。
create function fncf5a1U_E returns voie as '
begin
conv_proc(
integer, -- 変換元符号化方式ID
integer, -- 変換先符号化方式ID
cstring, -- 変換元文字列(ヌルで終わるC言語文字列)
internal, -- 変換先文字列(ヌルで埋められたC言語文字列)
integer -- 変換元文字列長
) RETURNS void;
end;'
language 'plpgsql';
create conversion cf5a1U_E for 'UTF8' TO 'EUC_JP' from fncf5a1U_E;
create function fncf5a1E_U returns voie as '
begin
conv_proc(
integer, -- 変換元符号化方式ID
integer, -- 変換先符号化方式ID
cstring, -- 変換元文字列(ヌルで終わるC言語文字列)
internal, -- 変換先文字列(ヌルで埋められたC言語文字列)
integer -- 変換元文字列長
) RETURNS void;
end;'
language 'plpgsql';
create conversion cf5a1E_U for 'EUC_JP' to 'UTF8' from fncf5a1E_U;
といったことのようなのですが、肝心のconv_porcの書き方がわからない。
上記ホームページのコードでは変換テーブルをまるまる書き換えてしまうようなので、そこまでしなくても良く、問題になっている3文字の変換を追加したいところです。
一応、上記ホームページから変換コードをダウンロードしてmakeしてみましたが、そのままではエラーになってしまいます。
取りあえず時間も無いので、今回はここまでとして、conv_procの書き方は追々調べていくことにします。
しかし、問題となる文字をSolarisのマップに追加した覚えはありません。自動でマップに追加されるのだろうか? SolarisのPostgreSQLは最初からインストールされているものを使用しているのだが。(次回、サーバー更新時に問題になりそうなので、よく調べておかなければならない。)
また、CentOSのコンソールでは日本語を表示できるような設定にしていないので、TeraTermProからPostgreSQLを操作するのですが、その時のコードはrecieve、transmit共にEUC。
それからもう一つ、これまでencodingはいつもEUC_JPとしてきましたが、石井先生の対策の中に、「PostgreSQL側もUTF8にしてしまう」というのもあって、どうせAccessからしかデータベースを操作しないので、UTF8の方が今後、問題が少ないと思いました。現状はEUC_JPとして使用しているので、次回サーバー更新時にdumpデータEUC_JPからUTF8に変換してしまうことも検討したいと思います。
pg_dump databasename --encoding=UTF8 > databasename_UTF8
とするとEUC_JPからUTF8に変換できない文字がwarningとして表示される。
warning以降はそのテーブルのデータは無視されるようです。
ダンプデータをバイナリエディッタでDANDP(EUC表示が可能)で調べてみると、どうも以前外字として定義していたml(ミリリットル)、手書き文字のリトッル、m3(リュウベ)といった文字が未だに残っているようで、実際、Solarisでもこの文字は表示されずに空白になっている。やはり、次回更新時にUTF8にして綺麗に整理する必要がありそう。
(販売管理プログラムの修正が多くて、これ以上時間が作れないので新しいサーバーはまた、時間がある時に検討します。)
うまく動作しているように思ったPostgreSQLでしたが、
ODBC--呼び出しが失敗しました。
ERROR; character Oxf5a2 of encoding "EUC_JP" has no equivalent in "UTF8";
というエラーでてしまい。サーバーからうまくselectできません。
キャラクターコードの変換エラーなので、元々インストールされている、PostgreSQLのconfigure設定が悪いのかと思い、CentOSに最初から入っているPostgreSQLをアンインストールしました。
# pg_ctl stop
# yum remove postgresql
# userdel postgres
一応再起動して、Windowsパソコンからダウンロードしてきた、PostgreSQL8.2.5のソースコードをSamba経由でCentOSに持ってきます。インストールは
http://honana.com/postgresql/82/install.html
を参考にしました。
# useradd postgres
# passwd postgres
としておいて、/home/postgres/.bashrcにいつもの環境設定をします。
$ source /home/postgres/.bashrc
いつもの手順でソースコードを解凍してconfigureしますが、「readlineとzlibが無い」というエラーがでるので、
$ configure: error: readline library not found
# yum -y install readline-devel zlib-devel
としてネットワークインストールします。再度configureすると今度は問題なし。ソースファイルのディレクトリで
$ ./configure
$ make all
$ make install
$ initdb --no-locale --encoding=EUC_JP
$ createdb databasename
$ psql databasename -e <dump_data
これでうまくいくようなのですが、以前Solarisに移行した時も同じようなことがありましたが、EUC_JPの
0xff5e
0xf5a1
0xf5a2
が、UTF8に対しての変換マップがないようで、エラーが出ます。syslogの設定のよってはエラーがでませんが、CentOSのデフォルトのPostgreSQLではダンプデータ取込時に
$ psql databasename -e <dump_data > 1.txt
何てしてやると、画面にはエラーだけが表示されていました。./configureしてインストールした時はsyslogオプションを設定していなかったためか、あるいはその後confファイルを編集していないためか、エラーが画面表示されませんでした。結局、CentOSデフォルトのPostgreSQLと同様に./configureしたPostgreSQLも上記文字がマッピングからもれているために、Windowsの販売管理プログラムからテーブルを開いてやるとエラーがでてしまいます。
(CentOSに最初からインストールされているPostgreSQLもinitdb時にエンコードを指定してやるので、実は問題なかった。エラーの原因は文字変換マップにありました。)
エラーがでるのは取りあえずそのままにして、自動起動の設定を下記でします。
# install -o root -g root -m 755 /usr/local/src/postgresql-8.2.5/contrib/start-scripts/linux
/etc/rc.d/init.d/pgsql
# chkconfig --add pgsql
これまで自動起動のクリプトは、石井先生の「PostgreSQL完全攻略ガイド」中のコードを使用していましたが、今回はソースコードに含まれているものが使用します。
自動起動までこぎつけたものの、WindowsパソコンからODBC接続してテーブル(商品テーブル)を開くとエラーがでてしまいます。上記の3つ?の文字が変換できません。以前もこの3文字については他の文字に変換してからdumpしたような記憶があります。「~」となんだったかよく覚えていません。
このコード番号はEUCの一般的なマップには含まれていないようでした。定義されていない番号になっていました。LinuxでEUC_JPとして定義されているのでしょう。どの文字が該当するのかよくわかりません。
character 0xf5a1 of encoding "EUC_JP" has no equivalent in "UTF8"
というエラーなので、EUC_JPにあってUTF8に無いようなのですが。
ここに参考になる説明があります。
http://ml.postgresql.jp/pipermail/pgsql-jp/2004-September/017522.html
create conversionすれば良いようなのですが。
一応、変換テーブルに上記文字コードのマップを追加することも検討してみました。
create function fncf5a1U_E returns voie as '
begin
conv_proc(
integer, -- 変換元符号化方式ID
integer, -- 変換先符号化方式ID
cstring, -- 変換元文字列(ヌルで終わるC言語文字列)
internal, -- 変換先文字列(ヌルで埋められたC言語文字列)
integer -- 変換元文字列長
) RETURNS void;
end;'
language 'plpgsql';
create conversion cf5a1U_E for 'UTF8' TO 'EUC_JP' from fncf5a1U_E;
create function fncf5a1E_U returns voie as '
begin
conv_proc(
integer, -- 変換元符号化方式ID
integer, -- 変換先符号化方式ID
cstring, -- 変換元文字列(ヌルで終わるC言語文字列)
internal, -- 変換先文字列(ヌルで埋められたC言語文字列)
integer -- 変換元文字列長
) RETURNS void;
end;'
language 'plpgsql';
create conversion cf5a1E_U for 'EUC_JP' to 'UTF8' from fncf5a1E_U;
といったことのようなのですが、肝心のconv_porcの書き方がわからない。
上記ホームページのコードでは変換テーブルをまるまる書き換えてしまうようなので、そこまでしなくても良く、問題になっている3文字の変換を追加したいところです。
一応、上記ホームページから変換コードをダウンロードしてmakeしてみましたが、そのままではエラーになってしまいます。
取りあえず時間も無いので、今回はここまでとして、conv_procの書き方は追々調べていくことにします。
しかし、問題となる文字をSolarisのマップに追加した覚えはありません。自動でマップに追加されるのだろうか? SolarisのPostgreSQLは最初からインストールされているものを使用しているのだが。(次回、サーバー更新時に問題になりそうなので、よく調べておかなければならない。)
また、CentOSのコンソールでは日本語を表示できるような設定にしていないので、TeraTermProからPostgreSQLを操作するのですが、その時のコードはrecieve、transmit共にEUC。
それからもう一つ、これまでencodingはいつもEUC_JPとしてきましたが、石井先生の対策の中に、「PostgreSQL側もUTF8にしてしまう」というのもあって、どうせAccessからしかデータベースを操作しないので、UTF8の方が今後、問題が少ないと思いました。現状はEUC_JPとして使用しているので、次回サーバー更新時にdumpデータEUC_JPからUTF8に変換してしまうことも検討したいと思います。
pg_dump databasename --encoding=UTF8 > databasename_UTF8
とするとEUC_JPからUTF8に変換できない文字がwarningとして表示される。
warning以降はそのテーブルのデータは無視されるようです。
ダンプデータをバイナリエディッタでDANDP(EUC表示が可能)で調べてみると、どうも以前外字として定義していたml(ミリリットル)、手書き文字のリトッル、m3(リュウベ)といった文字が未だに残っているようで、実際、Solarisでもこの文字は表示されずに空白になっている。やはり、次回更新時にUTF8にして綺麗に整理する必要がありそう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます