cx_oracle连接oracle的us7ascii数据集乱码问题

文章讲述了在Oracle数据库中遇到的字符集问题,us7ascii无法处理中文。介绍了两种无效的方法和最终的解决方案,即通过查询数据库并使用Python的raw和decode功能以二进制流形式传输中文数据,避免字符集转换问题。
摘要由CSDN通过智能技术生成

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,坑人。
希望帮助到你了,能帮忙点个赞,顶上去,让更多人少走弯路。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值