私のデータベースは UTF-8 (PostgreSQL) です。「TESTµTEST」をデータベースに保存しましたが、問題ありません。しかし、データベースからこの値を選択すると、'TESTµTEST' が表示されました。
さらに、リクエストを行ったときに、次のselect * from tbl where f='TESTµTEST'
エラーが発生しました。
エラー: エンコード "UTF8" のバイト シーケンスが無効です: 0xb5。
解決策を教えてください。
私のデータベースは UTF-8 (PostgreSQL) です。「TESTµTEST」をデータベースに保存しましたが、問題ありません。しかし、データベースからこの値を選択すると、'TESTµTEST' が表示されました。
さらに、リクエストを行ったときに、次のselect * from tbl where f='TESTµTEST'
エラーが発生しました。
エラー: エンコード "UTF8" のバイト シーケンスが無効です: 0xb5。
解決策を教えてください。
このエラーは、latin-1 テキストを utf-8 であるかのようにデコードしようとしていることを示しています。client_encoding
PHP の設定が、実際に送信しているデータのエンコーディングと一致していない可能性があります。
文字列 "TESTµTEST" は、データを Unicode から utf-8 バイト シーケンスにエンコードし、それを latin-1 としてデコードすることによって生成されます。これは psql で確認できます。
regress=# select convert_from(convert_to('TESTµTEST','utf-8'),'latin-1');
convert_from
--------------
TESTµTEST
PostgreSQL データベースがに正しく設定されていれば、入力utf-8
は に変換されます。が正しく設定されておらず、エンコードされたデータを送信すると、PostgreSQL は次のメッセージを表示して受信を拒否します。latin-1
utf-8
client_encoding
latin-1
client_encoding
utf-8
latin-1
invalid byte sequence for encoding "UTF8": 0xb5
...SELECT
あなたが示したものを実行するとどうなりますか。つまり、クライアントはに設定されていると思いますclient_encoding = 'utf-8'
が、PHP スクリプトは実際にlatin-1
データを送信しています。@dezso が言うように、latin-1
エンコーディングを使用しているテキスト エディターで PHP スクリプトを編集しているためだと思います。
PHP が使用しているエンコーディングを調べるには、PHP データベース接続を使用して を実行しますSHOW client_encoding;
。
データベースのエンコードを表示するには、次を実行します。
SELECT d.datname, pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding"
FROM pg_database d WHERE datname = 'my_db_name_here';
ああ、別の可能性として、Apache (または何でも) は PHP スクリプトがエンコードされていることを期待してutf-8
いますが、実際にはlatin-1
エンコードされたファイルです。
同じシンボル (標準栄養データベース v26のテーブル) を含むテーブルを PostgreSQL 9.1 にコピーすると、同じエラーが発生しました。新しいエンコーディングでデータベースを再作成しましたが、適切なロケールとテンプレートも指定する必要がありました。
CREATE DATABASE testdb
WITH OWNER = postgres
ENCODING = 'LATIN1'
LC_COLLATE = 'eng_canada.28591'
LC_CTYPE = 'eng_canada.28591'
TEMPLATE = template0;