问题:
使用cx_Oracle查询数据,包含中文
大多数数据没有问题
某一条数据会报UnicodeDecodeError
的错
数据库采用字符集SIMPLIFIED CHINESE_CHINA.ZHS16GBK
解决办法:
首先import os
然后os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
如果有耐心,下面是我遇到问题到解决问题的过程:
python使用cx_Oracle查询oracle报错UnicodeDecodeError: 'gbk' ……
搜索以上内容可以看到很多帖子教你如何查询oracle数据库使用的字符集,然后import os
使用os.environ['NLS_LANG'] = 'SIMPLIFIED ***'
指定客户端(也就是python程序所在环境)使用相同的字符集。
但是,我按照这些”教程”操作之后,程序依旧会报UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 27: illegal multibyte sequence
的错误。首先是在google上狂搜了一通,但是得到的结果都是让统一字符集之类的。然后,转向几个python交流群提问,但是并没有解决问题。最后我在代码中把出错那条记录的rownum找到,然后使用sqldeveloper查找这条记录,一眼就看到了罪魁祸首这个土扁
读作pian,长用作地名。我尝试用python对这个字进行编码,使用'土扁'.encode('gbk')
果然报错了,而'土扁'.encode('utf-8')
却能正常编码,于是抱着试试看的态度,把原来使用的os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
(数据库使用SIMPLIFIED CHINESE_CHINA.ZHS16GBK
字符集)换成了os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF-8'
,神奇的事情发生了,一口气跑500万的数据也报错了。
但是还有一事不明,既然数据库使用ZHS16GBK
编码,为什么这个怪怪的字能存进去呢?求大神指点。