CentOS 上の PostgreSQL を Windows 8 Pro 上の A5:SQL Mk-2 64bit Edition Version 2.10.1(汎用SQL開発ツール/ER図ツール)を使って操作しているのだが、
character 0xfac9 of encoding "EUC_JP" has no equivalent in "UTF8"
のようなエラーが出て見れないテーブルがある。
元の DB が EUC-JP で作られており、それを UTF-8 に変換して結果を返そうとして PostgreSQL が出しているエラーのようである。
つまり、EUC-JP で 0xFAC9 である文字コードを、UTF-8 の 0xE6A192 に変換できないってことだな。
ちなみに問題の漢字は「桒」。「桑」の俗字なんだけど、この字を使った苗字とか存在してて(俺も一人知ってる)、「桒原」と書けば「くわばら」と読む。
一応、Shift_JIS や JIS、UTF-8、UTF-16 にも存在している文字である・・・が、「俗字」ということで、ハシラダカ「髙」なんかと同じように、OS や DBMS によって実装で色々もめている文字ではある(^^;
PostgreSQL のソースに含まれる EUC-JP→UTF-8 変換用のマッピングファイル(src/backend/utils/mb/Unicode/euc_jp_to_utf8.map)を確認すると、確かに 0xFAC9 から 0xE6A192 への変換情報は存在していないようだ。
~{0xf4a5, 0xe5879c},{0xf4a6, 0xe78699},{0x8fa2af, 0xcb98},{0x8fa2b0, 0xcb87},~
0xF4A6 の次は、もういきなり 3バイト EUC コードの 0x8FA2AF になってる。
(0xF9A1~0xFCFE 間の 374文字は変換テーブルに載せてもらえてないようだ(^^;)
対応方法として、この間に、{0xfac9, 0xe6a192} という情報を追加してやって、もう一度 PostgreSQL をコンパイルしてやればいい。
(UTF-8→EUC-JP 変換用の utf8_to_euc_jp.map にも逆向きの情報を登録してやる必要あり)
が、これ、お客さんところの環境なので勝手にコンパイルするわけにもいかず(^^;
まあ、A5:SQL が UTF-8 への変換を要求しているのが問題なわけで、EUC-JP のまま使うのであれば問題ない。文字コード EUC-JP で SSH 接続して、ターミナル上で psql 使うしかないか(^^;
<参考>
非常に古い投稿についての質問で恐縮です。
0xf9a1~0xfcfeのマップファイルへの領域の追加はどうすればいいですか?
追加をやろうと思いましたが、マッピングに失敗してコード自体がぐちゃぐちゃになってしまいました。
Offsetがよくわからないです…
やってみたわけではないし、今手元に環境がないので実際のファイルを確認したわけではないですが・・・
euc_jp_to_utf8.map に、
{0xf9a1, 0xe7ba8a},
{0xf9a2, 0xe8a49c},
...
{0xfcfe, 0xefbc82},
って追加してリコンパイルするだけでは?
これではうまくいかなかったってことですかね???
迅速なご返答ありがとうございます。
もともとコードマップには存在しない領域だったので、
領域を追加しなければならなくなりました。
そして領域を追加したらマッピング自体がおかしくなりました。
多分offsetが関係しているのですが。
よくわからないです。
インターネットで探しても、情報が全く載っていないのでわからないです(泣)
なるほど。
マッピングファイルには正しく記述したが、マッピング情報がおかしくなったということですか。
offset が何に対する offset値をおっしゃっているのかわかりませんが、当方も、
https://ml.postgresql.jp/pipermail/pgsql-jp/2008-March/014441.html
この情報を見て「こうすればいいのね」とメモっただけで、ブログにもあるように実際にやってみたわけではないので、これ以上はわからないですね・・・お力になれなくてすみません(^^;
ここに書かれているように、
1.
src/backend/utils/mb/Unicodeにて
sjis_to_utf8.mapにコードを追加
utf8_to_sjis.mapにコードを追加
2.
src/backend/utils/mb/conversion_procs/utf8_and_sjisにて
make clean
make
make install
3.
psqlで次を実行
DROP CONVERSION pg_catalog.sjis_to_utf8;
CREATE DEFAULT CONVERSION pg_catalog.sjis_to_utf8 FOR 'SJIS' TO 'UTF8' FROM sjis_to_utf8;
DROP CONVERSION pg_catalog.utf8_to_sjis;
CREATE DEFAULT CONVERSION pg_catalog.utf8_to_sjis FOR 'UTF8' TO 'SJIS' FROM utf8_to_sjis;
4.
確認
とやって駄目だったってことですよね?
ご連絡ありがとうございます。
おっしゃる通りの手順の通りやってみましたがダメでした。
mapファイル内にはoffsetという値があって、
この値が何を意味するのか全くもって分かりません。
そしてこのオフセットの値が正しくないので、エラーになっているのだと思います。
とりあえず別の方法を試してみようと思います。