2012-08-14 83 views
0

我的數據庫是UTF-8(PostgreSQL)。我將'TESTμTEST'保存到數據庫中,並且沒問題。但是當我從數據庫中選擇這個值時,我看到了'TESTμTEST'。PostgreSQL中的UTF-8問題

而且,當我提出的要求select * from tbl where f='TESTµTEST',我得到這個錯誤:

ERROR: invalid byte sequence for encoding "UTF8": 0xb5.

請你給我任何的解決方案?

+0

需要更多信息。什麼編程語言和/或連接方法?顯示你的代碼。 – deceze 2012-08-14 09:55:44

+0

我使用Php和pg_connect和pg_query。 – 2012-08-14 10:15:54

+0

'0xB5'是「μ」的Latin-1編碼,它不是UTF-8。 – deceze 2012-08-14 10:18:00

回答

3

該錯誤表明您嘗試解碼拉丁文文本,就好像它是utf-8一樣。 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-8latin-1輸入轉換爲utf-8如果client_encoding被正確設置到latin-1。如果client_encoding正確設置爲utf-8,你發送latin-1編碼數據,PostgreSQL將拒絕與信息接受它:

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'; 

哦,另一種可能是阿帕奇(或其他)預計PHP腳本是utf-8編碼的,但它們實際上是latin-1編碼的文件。

+0

謝謝大家的幫助。 – 2012-08-14 15:35:59

0

將表複製到包含相同符號的PostgreSQL 9.1時(表standard nutrient database v26),我遇到了同樣的錯誤。我用新的編碼重新創建了數據庫,但我也必須指定相應的locale and template

CREATE DATABASE testdb 
    WITH OWNER = postgres 
    ENCODING = 'LATIN1' 
    LC_COLLATE = 'eng_canada.28591' 
    LC_CTYPE = 'eng_canada.28591' 
    TEMPLATE = template0;