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

Morita Kazuro morita @ yuki.ad.jp
2007年 2月 23日 (金) 12:13:12 JST


----- Original Message ----- 
From: "ISHIDA Akio" <iakio @ mono-space.net>
To: "PostgreSQL Japanese Mailing List" <pgsql-jp @ ml.postgresql.jp>
Sent: Wednesday, February 21, 2007 5:18 PM
Subject: [pgsql-jp: 38071] Re:データ移行時の文字コードエラーについて


> 石田です。
> 
> 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 メーリングリストの案内