python3 cx_Oracle.connect连接数据库乱码 codec can‘t decode byte ordinal not in range(128)

这是一篇可能稍微有点复杂的针对数据库数据查询的解决方法,做好准备。

从数据库获取数据步骤如下

#直接执行无效,从数据库获取数据如下
conn=cx_Oracle.connect #第一步:连接数据库
cursor=conn.cursor()#第二步:定义游标
cursor.execute()#第三步:执行语句
data=cursor.fetchall()#第四步:获取数据

数据库为oracle,数据库很老很原始,英文和数字能读出来,中文就乱码

【走过的弯路】

一、NLS_LANG设置

数据库中查询字符集状态

select * from nls_database_parameters;

接着挨个凑环境变量

os.environ['NLS_LANG']=

我的电脑中的环境变量NLS_LANG和程序中os.environ的环境变量,试过(SIMPLIFIED CHINESE_CHINA,AMERICAN_AMERICA.)(UTF8,AL32UTF8,US7ASCII,AL16UTF16等等),你想到的我应该都试了,还是不行,要么提醒codec can't decode报错无法获取数据,要么获取到的数据就是乱码问号?

二、cx_Oracle.connect

该函数中的encoding和nencoding设置也试了好多,ascii,UTF-8,UTF-16,iso-8859-1等等,与上面的环境变量组合排列结果还是一样,要么报错读不出来,要么能读就是乱码

【解决办法,简单粗暴】

比如select name from user;在程序读取出来乱码,先用plsql执行语句,看得到什么中文字符,比如我得到中心,在http://www.mytju.com/classcode/tools/encode_gb2312.asp网址中输入中心会得到该字符的各种编码方式如图

接着再在sql语句上着手,python程序中将第三步的sql语句由中文转化为十六进制,尝试select rawtohex(name) from user;程序数据读取到字符串D6D0D0C4,根据这个码去找上图的编码方式,发现他是GBK编码16进制,我们试着将该字符decode,encode一下均得不到中文字符如下。

我们试着将其转化为二进制并加上\x

ok,成功一半,得到了中文,那有直接中文转化为上述格式的sql语句吗?有,将其改为select utl_raw.cast_to_raw(name) from user;即可

ok,该函数在python中为我们直接得到的二进制字符,且为\xd6的格式,我们直接在其后面.decode('gbk')即可得到中文字符。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值