暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维数据库的字符集问题

IT那活儿 2025-06-18
52

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!



报错现象

某业务侧报磐维数据库在执行一张表的insert操作时报错,报错如下:
Caused by: org.panweidb.util.PSQLException: ERROR: character with byte sequence 0xc20xa0in encoding "UTF8" has no equivalent in encoding "GBK"


报错分析

初步判断是字符集编码不匹配导致字符集转换报错,登录数据库确认字符集:
--查看客户端字符集是UTF8
aaadb1=> show client_encoding ;
+-----------------+
| client_encoding |
+-----------------+
| UTF8 |
+-----------------+
(1 row)

--查看数据库字符集是GBK
aaadb1=> show server_encoding ;
+-----------------+
| server_encoding |
+-----------------+
| GBK |
+-----------------+
(1 row)

创建一张测试表,手工执行insert操作,复现故障:
aaadb1=> \i test1.sql
gsql:test1.sql:2: ERROR: character with byte sequence 0xc2 0xa0 in encoding "UTF8"hasno equivalent in encoding "GBK"

由此可以确认是客户端和数据库端字符集不一致造成的报错,设置客户端字符集为GBK后重新执行insert操作
aaadb1=> \encoding GBK 
aaadb1=> show client_encoding ;
+-----------------+
| client_encoding |
+-----------------+
| GBK |
+-----------------+
(1 row)

aaadb1=> \i test1.sql
gsql:test1.sql:2: ERROR: invalid byte sequence for encoding "GBK"0x800xe6

还是报错了,按说修改客户端字符集后应该可以插入成功的,难道是入库文件test1.sql 的字符集编码也要修改为GBK
那就改改试试,用notepad修改文件编码为中文GB2312再执行试下:
aaadb1=> selectcount(*from test1;
+-------+
| count |
+-------+
27439 |
+-------+

aaadb1=> \i test1.sql
test1ERT 01

aaadb1=> selectcount(*from test1;
+-------+
| count |
+-------+
27440 |
+-------+



隐患排查

手工入库可以,业务侧使用java程序失败,和业务侧沟通检查java连接串配置,发现charset设置的是UTF-8,和当前数据库服务端的GBK不一致,业务侧修改为GBKjava程序执行成功。


问题总结

字符集涉及到三个因素,数据库服务端、客户端、输入文件三者的字符集编码要保证三码统一才可以入库成功。

END


本文作者:辛志梁(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论