invalid byte sequence for encoding "UTF8": 0xe99d2c

本文介绍了解决在PostgreSQL数据库中插入中文时出现的字符集编码错误的方法。通过调整客户端编码为GBK,使得能够正确地将GBK编码的中文转换为数据库的UTF8编码。


Query failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xe99d2c


原因是客户端字符集和插入内容的字符集不匹配。PostgreSQL默认不做字符集转换,如果数据库是UTF8的字符集,一般终端的中文字符集会设置为GBK(可以看LANG环境变量确认),所以这个编码不经转换的存入数据库中,而数据库是UTF8的,PostgreSQL发现不是UTF8编码,就报上面的错。
要想打开自动字符集转换功能,必须告诉 pg 客户端使用的字符集。这时可以设置pg客户端编码为GBK,pg就会自动做字符集转换。

下面是实验:



1
[root@hostalonetest ~]# psql -h 192.168.18.210 -Upostgres beiigang
psql.bin (9.3.5, server 9.1.14)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.


beiigang=# 


2
beiigang=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 beiigang   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 


3
beiigang=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)


4
beiigang=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)


5
beiigang=# create table tb_tt (id int, ctnr varchar(60));
CREATE TABLE


6
beiigang=# insert into tb_tt(id,ctnr) values(1,'新華網');
ERROR:  invalid byte sequence for encoding "UTF8": 0xd0c2


7
beiigang=# \encoding GBK


8
beiigang=# show client_encoding;
 client_encoding 
-----------------
 GBK
(1 row)


9
beiigang=# insert into tb_tt(id,ctnr) values(1,'新華網');
INSERT 0 1


10
beiigang=# select * from tb_tt;
 id |  ctnr  
----+--------
  1 | 新華網
(1 row)


11
beiigang=# show client_encoding;
 client_encoding 
-----------------
 GBK
(1 row)


beiigang=# 
beiigang=# reset client_encoding;
RESET
beiigang=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)


写代码时可以根据情况在建立数据库链接时指定客户端字符集编码

参考:

http://www.postgresql.org/docs/9.3/interactive/multibyte.html




----------------- 

转载请著明出处:
blog.csdn.net/beiigang

在 PostgreSQL 中,`invalid byte sequence for encoding "gb18030": 0xa8` 错误通常表示数据库尝试将数据解释为 `gb18030` 编码(中国国家标准字符集),但遇到了不符合该编码规范的字节序列。这可能发生在导入数据、执行 SQL 脚本或插入包含非 GB18030 字符的内容时。 ### 常见原因与解决方法 #### 1. 数据库编码设置不匹配 PostgreSQL 在创建数据库时会指定默认编码,如果客户端发送的数据与数据库实际使用的编码不一致,就可能出现此错误。确保数据库编码设置为 UTF-8 是一种常见且推荐的做法,因为 UTF-8 支持更广泛的字符集[^1]。 ```sql -- 查看当前数据库编码 SELECT pg_database.datname, pg_encoding_to_char(pg_database.encoding) FROM pg_database; -- 修改数据库编码(需在模板数据库基础上重建) -- 注意:修改数据库编码需要高级操作,建议在维护窗口进行 ``` #### 2. 客户端编码设置不当 客户端连接到数据库时也需要正确配置编码。可以使用以下命令查看和设置客户端编码: ```sql -- 查看当前客户端编码 SHOW client_encoding; -- 设置客户端编码为 UTF-8 SET client_encoding TO 'UTF8'; ``` 在连接字符串中也可以显式指定编码,例如使用 `psql` 连接时: ```bash psql -U username -d dbname --set client_encoding=utf8 ``` #### 3. 数据本身包含非法字符 如果数据源包含无法被目标编码识别的字符(如某些特殊符号或 Unicode 字符),则需要清理或转换数据。可以在插入前进行预处理,或者使用 `CONVERT()` 函数强制转换编码: ```sql -- 示例:将文本从 UTF-8 转换为 GB18030(如果支持) SELECT CONVERT('特殊字符' USING utf8_to_gb18030); ``` #### 4. 使用兼容性更强的编码 GB18030 不支持所有 Unicode 字符,而 UTF-8 则更为通用。建议将数据库编码更改为 UTF-8,以避免此类问题: ```sql -- 创建新数据库并指定 UTF-8 编码 CREATE DATABASE new_db WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE template0; ``` #### 5. 检查文件编码(如 CSV 导入) 如果通过 `COPY` 或 `\copy` 命令导入文件,确保文件本身的编码与数据库/客户端设置一致。可使用 `iconv` 工具转换文件编码: ```bash iconv -f GB18030 -t UTF-8 input.csv > output.csv ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值