本文主要是介绍cx_oracle连接oracle的us7ascii数据集乱码问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.问题
oracle数据库使用到的字符集是us7ascii,总的来说就是ascii数据集,7位表示一个字符,对于英文还没有问题,但是遇到中文就G了。
查看自己数据库使用的字符集:
SELECT value
FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
2.网上出的解决方法(弯路)
第一种方法
import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
这是在cx_oracle5或者之前的版本可以支持,现在都升到9了,甚至官网都不建议使用cx_oracle了,建议使用他们最新的驱动,不需要本地下载客户端。
第二种方法
# 替换以下信息为你的实际数据库连接信息
dsn_tns = cx_Oracle.makedsn('****', '***', service_name='***')# 字符集和字符编码
encoding = 'UTF8'
self.connection = cx_Oracle.connect(user='123', password='123', dsn=dsn_tns, encoding=encoding)
这种方法对于数据库字符集本来就是utf8或者gbk的数据好使,但是对于数据库字符集是us7ascii的真的没用。
3.真正的解决方法
cursor.execute("SELECT DAY,utl_raw.cast_to_raw(OPERATORS) from table")
for raw in cursor:# gbk,utf-8等等都尝试下print(str(raw[1], encoding='gbk'))
最后就能显示中文,如果使用pandas的,也可以使用pandas的decode方法来重新编码。
它的原理其实就是将数据库的中文数据不适用us7ascii编码,而是直接传输二进制流传输到客户端,客户端通过gbk编码就可以了。
对于很多老旧的项目的数据库,没怎么维护,也没怎么用,索性数据库字符集就是默认的us7ascii,坑人。
希望帮助到你了,能帮忙点个赞,顶上去,让更多人少走弯路。
这篇关于cx_oracle连接oracle的us7ascii数据集乱码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!