2013-03-06 161 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)集名稱和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');

是否有任何其他的方式來解決這個問題?

該錯誤只有當我試圖插入非ASCII字像阿拉伯或日語字

+0

您可以將所有的鏈接/數據庫編碼設置爲使用utf-8,但如果原始字符串不是utf-8編碼,它仍然會導致錯誤。 – datasage 2013-03-06 16:13:45

+0

您能否將pgAdmin的'SHOW client_encoding;'的結果發佈出來? – Houari 2013-03-06 20:34:19

+1

請在錯誤報告中顯示單字符輸入和相應的字節序列(如'0xd85b')。你也應該告訴我們你的操作系統默認的文本編碼是什麼;如果你不知道,如果你在Linux/Unix上運行'locale'命令。在不知道原始編碼和原始文本的情況下,很難說很多。 – 2013-03-06 23:41:32

回答

4

嘗試編碼成UTF-8與函數utf8_encode()出現。

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

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

編碼整個查詢看起來很奇怪。 (另外,你的SQL例子可以更短,更準確地拼寫:) – 2014-02-26 00:50:55

-1

我'將不能提交正確的Unicode SQL查詢(的java變化從Unicode惡劣的工作和所有喜歡「集名稱‘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 ....

我已經從Windows 1252在PHP中只用編碼轉換爲UTF-8固定的錯誤: 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)"; 

希望這會幫助別人。

相關問題