0

私のデータベースは UTF-8 (PostgreSQL) です。「TESTµTEST」をデータベースに保存しましたが、問題ありません。しかし、データベースからこの値を選択すると、'TESTµTEST' が表示されました。

さらに、リクエストを行ったときに、次のselect * from tbl where f='TESTµTEST'エラーが発生しました。

エラー: エンコード "UTF8" のバイト シーケンスが無効です: 0xb5。

解決策を教えてください。

4

2 に答える 2

3

このエラーは、latin-1 テキストを utf-8 であるかのようにデコードしようとしていることを示しています。client_encodingPHP の設定が、実際に送信しているデータのエンコーディングと一致していない可能性があります。

文字列 "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-1utf-8client_encodinglatin-1client_encodingutf-8latin-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エンコードされたファイルです。

于 2012-08-14T12:14:57.190 に答える
0

同じシンボル (標準栄養データベース v26のテーブル) を含むテーブルを PostgreSQL 9.1 にコピーすると、同じエラーが発生しました。新しいエンコーディングでデータベースを再作成しましたが、適切なロケールとテンプレートも指定する必要がありました。

CREATE DATABASE testdb
  WITH OWNER = postgres
  ENCODING = 'LATIN1'
  LC_COLLATE = 'eng_canada.28591'
  LC_CTYPE = 'eng_canada.28591'
  TEMPLATE = template0;
于 2013-08-26T23:06:51.630 に答える