ERROR,22021,Invalid Byte Sequence For Encoding “”UTF8″”

最近发现一个生产库的日志频繁地抛出以下错误:

1
ERROR,22021,invalid byte sequence for encoding ""UTF8"" ,

数据库日志

1
2
2011-03-01 00:28:59.149 CST,"skytf","skytf",27867,"127.0.0.1:41149",4d6bcd09.6cdb,1,"idle in transaction",  
2011-03-01 00:27:53 CST,159/515139,108295573,ERROR,22021,"invalid byte sequence for encoding ""UTF8"": 0xf09fe518",,,,,,,,,""

根据这个信息,猜测可能是字符集没有转换成 “utf8”,由于csv日志没有打出报错时相关的SQL语句,不好分析,于是联系开发人员,希望他们能够找出出错时间的SQL语句。开发人员非常配合,很快找到了相关SQL。

应用程序的日志

1
2
3
4
2011-02-28 14:54:26,059 /home/liweijing/skytf/gevent2/src/db.py(56): ERROR fail to batch write db. error 'ERROR:  
invalid byte sequence for encoding "UTF8": 0xf09fe518 ' in ' INSERT INTO table_log
( host, remoteip, ntime, reqdesc, httpcode, clength, refer, agent, hsman, hstype, imsi, fromcache, loadtime)
VALUES ( '????????', '117.136.16.97', '2011-02-28 14:54:20 ', 'GET HTTP/1.1', 705, 0, '-', 'Sky-Wapproxy/v3.20(page,0-1-1251)', 'dewav', 'L968', '460008857083989', False, 6 ); '

上面这段是开发人员贴出来的应用程序LOG,很容易发现,在向表 table_log 的字段插入数据时,host 字段的内容为乱码,即为 “????????” ,正是因为数据为乱码,才导致 PostgreSQL 频繁抛出以下错误:

1
ERROR,22021,invalid byte sequence for encoding ""UTF8""

解决方法

既然问题找出来了,解决起来就相对容易了,后来开发人员将字段 host 内容强制转换为 utf8 ,并且对服务端接收的数据进行检查,如果有非法字符,则丢弃。有了这些措施之后,数据库不再抛出类似ERROR。

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/236374.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论