AccessとLinux

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

create conversion その後

2007年12月30日 00時36分48秒 | Weblog
create conversionの件は結局うまくいきました。取りあえずこれでいつでもPostgreSQL8.2.*に移行できます。

下記ホームページを参考にしました。
http://ml.postgresql.jp/pipermail/pgsql-jp/2007-January/021518.html
http://ml.postgresql.jp/pipermail/pgsql-jp/2007-January/021520.html
http://ml.postgresql.jp/pipermail/pgsql-jp/2007-January/021522.html

上記のホームページでもそうですが、私の場合もPostgreSQL8.1.3から8.2.5へデータ移行時に変換エラーがでました。今後、8.2以降のバージョンを使用するのであれば、やはりencodingはUTF8に変更しておく必要があるのではないかと思います。

変換エラーの原因を調べてみるとEUC_JP値の
f5a1
f5a2
f5a3
f5a8
f5a9
f5ae
で変換エラーになります。これはEUC_JPでは定義されていない番号です。どうもBetrieve+Windows95で使用していた時の外字データがそのまま残っていたもののようです。現在使用しているWindowsXP、Vistaでは外字を使用していないので表示されませんし、Linux側(PostgreSQL側)の変換テーブルに値があるハズもありません。

そこで、次回サーバーのバージョンアップ時にUTF8に移行するための手順。

1.変換テーブルを修正してmakeする必要があるので、Linuxインストール時、PostgreSQLにパッケージはインストールしない。PostgreSQLのソースコードをダンロードして使用する。

2.上記のEUC_JP値が変換マップに無いことがわかっているので、PostgreSQLのEUC_JP<->UTF8の変換マップに未登録分のEUC_JP値を追加してmakeする。
/usr/local/src/postgresql8.2.5/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
を変更する。挿入する場所はEUC_JP側のコード順に並んでいる必要がある。
取りあえず全く使用していない、ユーロ記号に変換するものとして。
{0xf5a1, 0xe282ac}
{0xf5a2, 0xe282ac}
{0xf5a3, 0xe282ac}
{0xf5a8, 0xe282ac}
{0xf5a9, 0xe282ac}
{0xf5ae, 0xe282ac}
を追加する。
(もし最初からスペースに変換できれば後からreplaceする必要がないのだか、試験していないので何とも言えない。スペースのUTF-8を調べると0x20の半角なので、半角2文字0x2020にしなければならないのかもしれないが、よくわからない。全角を半角1文字に変換するのはどうも抵抗がある。)

3.旧サーバーのdumpデータはEUC_JPになっているので、map変更後一端、いつも手順で--encoding=EUC_JPでcreateする。
$ cd /usr/local/src/postgresql-8.2.5
$ ./configure
$ make all
$ make install
$ pg_ctl start
$ initdb --no-locale --encoding=EUC_JP
$ createdb databasename
$ psql databasename -e </home/pub/dumpdata_EUC_JP
4.UTF8ダンプデータの作成
$ pg_dump databasename --encoding=UTF8 > /home/pub/dumpdata_UTF8
                        (/home/pubは例えば)
この時、もし変換エラーがでればアンインストールして2に戻ってEUC_JP値をeuc_jp_to_utf8.mapに追加して再度makeする。アンインストールは
$ make uninstall

(特にアンインストールしなくても、上記ホームページにあるようにmapに追加した後、make clean;make; make installでも良いと思います。)

UTF8変換後データは大きくなる、ちなみに180MByteが220MByteになった.

5.UTF8でデータベースを作成。
最初、--encoding=EUC_JPでinitdbしてしまったので、今度は--encoding=UTF8でinitdbする。
(別に、initdb時でなくてもcreatedb時にencodingを指定してやれば良いのだが、いままでcreatedb時にencodingを指定してこなかったので、ついつい忘れてしまいそうになる、そのためinitdb時にUTF8に指定しておいた方が私の場合はよさそう。)
$ make uninstall
$ make all
$ make install
$ pg_ctl start
$ initdb --no-locale --encoding=UTF8
$ createdb databasename
$ psql databasename -e </home/pub/dumpdata_UTF8 これで、以前の外字がユーロマークになるが、必要ならWindows側でPGAdminのSQLから各テーブルを
  update table set mei = replace(mei, 'ユーロマーク', '')
としてやればユーロマークは削除される。
(これがいやなら、最初のmap加工時にスペースなりに対応させておけばテーブルを選んでreplaceする必要は無くなる。多分。)


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 結局うまくいかなかった | トップ | Accessを6年使ってみて »

コメントを投稿

Weblog」カテゴリの最新記事