我的數據庫是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.
請你給我任何的解決方案?
我的數據庫是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.
請你給我任何的解決方案?
該錯誤表明您嘗試解碼拉丁文文本,就好像它是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-8
將latin-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
編碼的文件。
謝謝大家的幫助。 – 2012-08-14 15:35:59
將表複製到包含相同符號的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;
需要更多信息。什麼編程語言和/或連接方法?顯示你的代碼。 – deceze 2012-08-14 09:55:44
我使用Php和pg_connect和pg_query。 – 2012-08-14 10:15:54
'0xB5'是「μ」的Latin-1編碼,它不是UTF-8。 – deceze 2012-08-14 10:18:00