22021 字符不在编目中
客户端向服务端发送或接收文本数据时,可能发生如下错误:
ERROR: invalid byte sequence for encoding "UTF8": 0xb2
可能的原因:
- 客户端系统环境编码与数据库客户端的编码配置不匹配(例如,客户端系统环境的
cp936
和数据库客户端的UTF8
)。 - 执行的SQL脚本文件的编码,与数据库客户端的编码配置不匹配。
- 文本流包含字符串中不允许的二进制数据(如 NUL 字节)。
解决方案:
在 Linux 上面,您可以使用locale
查看客户端系统环境的编码:
$ locale -k charmap
charmap="UTF-8"
在 Linux 上面,您可以使用file
查看 SQL 脚本文件的编码:
$ file --mime test.sql
test.sql: text/plain; charset=utf-8
在 Windows 上面,您可以使用chcp
查看客户端系统环境的编码:
> chcp
活动代码页: 936
上面显示的代码页936
,它是GBK
编码的别名。
您可以按如下方式查看数据库客户端编码:
postgres=# SHOW client_encoding;
client_encoding
-----------------
GBK
(1 row)
这样会将文本数据从客户端编码转换为数据库服务端编码。
您可以按如下方式查看数据库服务端编码:
postgres=# SHOW server_encoding;
server_encoding
-----------------
UTF8
(1 row)
如果数据库客户端的编码配置和客户端系统环境的编码不匹配,可以按如下所示修改数据库客户端编码:
SET client_encoding = 'UTF8'
如果 SQL 脚本文件的编码和数据库客户端的编码配置不匹配,可以按如下所示修改 SQL 脚本文件的编码:
$ iconv --from-code=GBK --to-code=UTF-8 test-gbk.sql > test-utf8.sql