0

我的数据库是 UTF-8 (PostgreSQL)。我将“TESTµTEST”保存到数据库中,没关系。但是当我从数据库中选择这个值时,我看到了“TESTµTEST”。

此外,当我提出请求时select * from tbl where f='TESTµTEST',我收到了这个错误:

错误:编码“UTF8”的字节序列无效:0xb5。

你能给我任何解决方案吗?

4

2 回答 2

3

该错误表明您正在尝试将 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-8ifclient_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编码文件。

于 2012-08-14T12:14:57.190 回答
0

将表复制到包含相同符号的 PostgreSQL 9.1 时遇到了同样的错误(来自标准营养数据库 v26的表)。我使用新编码重新创建了数据库,但我还必须指定适当的语言环境和模板

CREATE DATABASE testdb
  WITH OWNER = postgres
  ENCODING = 'LATIN1'
  LC_COLLATE = 'eng_canada.28591'
  LC_CTYPE = 'eng_canada.28591'
  TEMPLATE = template0;
于 2013-08-26T23:06:51.630 回答