[pgsql-jp: 38071] Re: データ移行時の文字コードエラーについて

ISHIDA Akio iakio @ mono-space.net
2007年 2月 21日 (水) 17:14:07 JST


石田です。

07/02/21 に YuGo<yu.gotou @ gtec-ni.com> さんは書きました:
> ISHIDA Akio どの
> > こんにちは。石田@苫小牧市です。
> >
> > 07/02/21 に YuGo<yu.gotou @ gtec-ni.com> さんは書きました:
> >>  中井 どの
> >>
> >> > YuGo wrote:
> >> >> バックアップしても、完全にリストアできないということですか。
> >> >> 2バイト文字の扱いについて、細かいところまでPostgreSQLに頼ってはいけ
> >> ない
> >> >> のかなと思いました。
> >> >
> >> > それは間違っています。基本的にeuc-jpとutf-8の間で完全に1対1の
> >> > 対応が仕様上できていないことに問題があります。
> >>
> >> 何が間違っているのか、さっぱりわかりません。
> >> PostgreSQLサーバでEUC-JPとUTF-8間の変換ができないとしたら、自分で変換し
> >> て投入しなければいけないということでしょう。
> >>
> >
> > そもそも今回の件と、euc-jpとutf-8間の文字コード変換とは
> > 何も関係無いんじゃないでしょうか。
> >
> > わかっていることは、0xa0caという謎のバイトシーケンスが
> > 何かのきっかけで移行前のDBに混在してしまったということだけです。
>
> 当方はPostgreSQL8.1.8にPHP4でアクセスしていますが、この例のようにEUC-JP
> のテーブルにinvalid byte sequenceをどうやってもぐりこませることができる
> のか、どうも方法がわかりません。バイト列0xa0caをvarchar型としてINSERTす
> る方法はありますか?このケースを再現する方法を知りたいです。
> わたしの場合はUTF-8しか使いませんが、データベースのチェックをすり抜ける
> のならPHPのmb_check_encoding関数を使ってあらかじめ制限しなければいけない
> のかなと考えています。
>

最近知ったのですが、dblinkを使うとできるらしいです^^。

冗談はさておき、
8.1.4/8.0.8/7.4.13/7.3.15 以降のバージョンでは、普通の
やりかたでは不正なバイト列をINSERTすることはできません。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060530/239359/

なので、YuGoさんの心配されているような目的で、プログラム側で
チェックする必要はありません。
(もちろんアプリケーション全体として、入力値をチェックすることは
良いことだと思いますが)。

逆に言えば、これらのチェックが上記のバージョンから導入された
ために、それより前のバージョンからのDBの移行を行う時に、
エラーが出てしまう可能性があります。

# 大量のダンプをリストアした時などは、エラーになると悲しいので、
# あらかじめプレーンテキスト内に不正なバイト列が無いか
# チェックするようなスタンドアロンなプログラムでも作ろうかと
# 思っているのですが。
-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>



pgsql-jp メーリングリストの案内