2013-03-06 147 views
10

テーブルに挿入するための簡単なSQL構文があります。私はPostgreSQL 8.4を使用しており、すでにデータベースエンコーディングをUTF8に、POSIXを照合と文字タイプに設定しています。Postgresql PHPがUTF8をエンコードするための無効なバイトシーケンス

私はpgadmin3で実行するとクエリは正常ですが、PHPで実行するとエラーが発生します。

"Internal Server Error: SQLSTATE[22021]: 
Character not in repertoire: 7 ERROR: 
invalid byte sequence for encoding \"UTF8\": 0xd85b\nHINT: 
This error can also happen if the byte sequence does not match the encoding expected by the server, 
which is controlled by \"client_encoding\" 

は、だから私は、PHP(PDO)からNAMESとCLIENT_ENCODINGを設定しようとしましたが、それでも私はネイティブPostgreSQLのドライバpg_pconnectを使用しますが、現在はしていた場合、同じ問題

$instance->exec("SET client_encoding = 'UTF8';"); 
$instance->exec("SET NAMES 'UTF8';"); 

pg_set_client_encoding($link, "UNICODE");は仕事も私の持っています私はドライバーとしてPDOを使用しています。

と私はまた、すでにこの問題を解決する他の方法はありmb_internal_encoding('UTF-8');

を設定しますか?

このエラーi)が(はutf8_encodeでUTF-8にエンコードしてみアラビア語や日本語の単語のような

+0

utf-8を使用するようにすべてのリンク/データベースエンコーディングを設定できますが、元の文字列がutf-8でエンコードされていない場合でもエラーが発生します。 – datasage

+0

pgAdminから 'SHOW client_encoding;'の結果を投稿できますか? – Houari

+1

1文字の入力と、エラーレポートの対応するバイトシーケンス(0xd85bなど)を表示してください。また、オペレーティングシステムのデフォルトのテキストエンコーディングが何であるか教えてください。もしあなたがわからなければ、Linux/unix上であれば 'locale'コマンドを実行してください。オリジナルのエンコーディングと元のテキストを知らなくても、あまり言い表せません。 –

答えて

4

を非ASCIIワードを挿入しようとしたときにのみ表示されます。

I'amはなり
$query = "INSERT INTO student (id, firstName, lastName, age) VALUES (1, 'myFisrtName', 'myLastName', 23)"; 

pg_exec($connection, utf8_encode($query)); 
+3

クエリ全体をエンコードするのが奇妙に思えます。 (また、あなたのSQLの例は、より短く、より正確なスペルかもしれません:) –

-1

正しいUnicodeのSQLクエリを発行することはできません(コナラ用のJavaがUnicodeなど、すべての悪い仕事を変えない "SET NAMES 'UTF8';" 何の作業を)、および私はのBase64 convertationからこれを解決:古いポストに答える

$name_enc = base64_encode($name);  
$res = $db->prepare(
      'INSERT INTO "MyTable"("ID", "Name") VALUES 
       ( nextval(\'gen_addresses\'), 
        convert_from(decode(?, \'base64\'), \'UTF8\'));' 
    )->execute(array($name_enc)); 
1

しかし、私はちょうどCSVのインポート中に、似たような状況があったが、私はエラーに気づいた: invalid byte sequence for encoding "UTF 8": 0x95 in ....

私は使用してPHPでUTF-8へのWindows-1252からエンコーディングを変換することによって、エラーを修正しました:これは誰かを助ける mb_convert_encoding($fieldValue,'UTF-8','Windows-1252')

$query = "INSERT INTO student 
       (id, firstName, lastName, age) 
       VALUES 
       (1, '".mb_convert_encoding($firstName,'UTF-8','Windows-1252')."', 
        '".mb_convert_encoding($lastName,'UTF-8','Windows-1252')."', 23)"; 

希望を。

関連する問題