我的数据库是 UTF-8 (PostgreSQL)。我将“TESTµTEST”保存到数据库中,没关系。但是当我从数据库中选择这个值时,我看到了“TESTµTEST”。
此外,当我提出请求时select * from tbl where f='TESTµTEST'
,我收到了这个错误:
错误:编码“UTF8”的字节序列无效:0xb5。
你能给我任何解决方案吗?
我的数据库是 UTF-8 (PostgreSQL)。我将“TESTµTEST”保存到数据库中,没关系。但是当我从数据库中选择这个值时,我看到了“TESTµTEST”。
此外,当我提出请求时select * from tbl where f='TESTµTEST'
,我收到了这个错误:
错误:编码“UTF8”的字节序列无效:0xb5。
你能给我任何解决方案吗?
该错误表明您正在尝试将 latin-1 文本解码为 utf-8。您在 PHP 中的设置很可能client_encoding
与您实际发送的数据的编码不匹配。
字符串“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
ifclient_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';
哦,另一种可能性是 Apache(或其他)希望您的 PHP 脚本被utf-8
编码,但它们实际上是latin-1
编码文件。
将表复制到包含相同符号的 PostgreSQL 9.1 时遇到了同样的错误(来自标准营养数据库 v26的表)。我使用新编码重新创建了数据库,但我还必须指定适当的语言环境和模板。
CREATE DATABASE testdb
WITH OWNER = postgres
ENCODING = 'LATIN1'
LC_COLLATE = 'eng_canada.28591'
LC_CTYPE = 'eng_canada.28591'
TEMPLATE = template0;