2009-11-05 82 views
10

私はmysqlからpostgresqlにdbを移行しています。 mysql dbのデフォルトの照合順序はUTF8で、postgresはUTF8も使用していますが、pg_escape_string()を使用してデータをエンコードしています。私はこれを理解しようとチャンスをうかがって、PHPは奇妙な何かをやっていることに気づいてきたPostgreSQL + PHP + UTF8 =エンコードに無効なバイトシーケンス

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

;:何らかの理由でしかし、私は悪いエンコーディングに関するいくつかのファンキーなエラーに実行していますよ文字列にASCII文字(例えば "hello")だけがある場合、エンコーディングはASCIIです。文字列にASCII文字以外の文字が含まれている場合、エンコーディングはUTF8(例: "Hëllo")であると言います。

すでにUTF8の文字列にutf8_encode()を使用すると、特殊文字が強制終了され、それらがすべて乱れてしまいます。これを動作させるには何ができますか?

(右今それをハングアップする正確な文字は「」ですが、だけではなく、検索/置換の、このちょっと問題が再び起こらないように、私はよりよい解決策を見つけるしたいと思います)

答えて

1

BTW ASCII文字列は、同じ最初の127文字を共有するため、UTF-8ではまったく同じです。 ASCIIの "Hello"はUTF-8の "Hello"とまったく同じです。変換は必要ありません。

テーブルの照合順序はUTF-8でもかまいませんが、同じエンコードで照合することはできません。今あなたがpg_escape_stringに与える情報に問題があるなら、MySQLから取り出されたコンテンツがUTF-8でエンコードされていると仮定している可能性が高いからです。 this page on MySQL documentationを見て、あなたの接続のエンコーディングを見ることをお勧めします。照合順序がUTF-8であるテーブルからフェッチしているかもしれませんが、接続はLatin-1のようなものです(çéèêöàなどの特殊文字はUTF-8でエンコードされません)。

+0

これを使って数時間を過ごした後、私は実際にmysqlがデータベースにutf8以外の文字列を許可していると考え始めました。これは問題の原因です。 – Ian

6

おそらく、MySQLデータベースのデータはUTF8ではありません。それはかなり一般的なシナリオです。 MySQLは少なくともデータの検証をまったく行わなかったので、クライアントがUTF8であると主張していれば、UTF8として投げたものはすべて受け入れました。彼らは今それを修正しているかもしれません(あるいはそうではないと思っているのかどうかわかりません)が、すでにdbに誤ってエンコードされたデータがあるかもしれません。もちろん、PostgreSQLはロード時に完全な検証を実行するため、失敗する可能性があります。

未知の文字を無視するように設定できるiconvなどのデータを使用してデータをフィードしたり、「最善の推測」に変換することができます。

+0

まさにiconv!ありがとう。 –

関連する問題