AccessとLinux

中小企業での販売管理プログラムの作成についての所感

結局うまくいかなかった

2007年12月24日 14時26分45秒 | Weblog
自宅の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にして綺麗に整理する必要がありそう。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« CentOSのネットワークインス... | トップ | create conversion その後 »

コメントを投稿

Weblog」カテゴリの最新記事