码迷,mamicode.com
首页 > Web开发 > 详细

使用Python解决Cx_Oracle查询时UnicodeDecodeError的问题

时间:2017-02-14 15:31:23      阅读:824      评论:0      收藏:0      [点我收藏+]

标签:

本文和大家分享的主要是使用python语言解决Cx_Oracle查询时UnicodeDecodeError的问题方法步骤,一起来看看吧,希望对大家有所帮助。
近期在项目中,要对1100多万条记录的表进行查询,然后进行一些数据的统计,但是在这个过程中,发现只查询出来几条数据就出现了UnicodeDecodeError了。
在这里,我们使用sqlalchemy库进行查询,其内部还是Cx_Oracle来进行对应的操作,使用的Python版本为3.5.0,宿主系统为Windows 2008 Server,然后进行类似如下的操作:
from sqlalchemy import create_engine
engine = create_engine(’oracle://demo:123456@192.168.1.202/TEST’)
conn = engine.connect()
sql = ’select t.type from TS t’
result = conn.execute(sql) for row in result:
print(row[’type’])
在这里,我们首先创建1个到数据库的连接,然后进行对应的查询操作。很不幸的是,只查询不到10条记录就出现了1UnicodeDecodeError错误了。
本来以为是数据库的服务器编码问题,因此在create_engine函数中追加了encoding参数,将其更改为:
engine = create_engine(’oracle://demo:123456@192.168.1.202/TEST’,encoding="UTF-8")
而另外1种可用的方式直接在连接路径中指定编码,类似如下:
engine = create_engine(’oracle://demo:123456@192.168.1.202/TEST?charset=utf-8’)
但是问题还是没有解决。在网上搜索了一下都没有找到适应的解决方案,突然想起来之前在使用Mysql数据库的时候,出现乱码的时候,我们常常会进行如下的操作:
set names gbk;
我们通过这种方式设置客户端的编码,而不是服务器端的编码,来解决终端下出现乱码的情况。而另外在Linux下安装Oracle的客户端时,设置了1个 NLS_LANG 的环境变量,详情可以参考 Ubuntu14.04安装Oracle Instant Client 这篇文章,当然这篇文章有一些细节的东西没有介绍。
一般情况下,我们在cmd中进行如下的设置:
setenv NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
我们指定Oracle消息使用的语言为简体中文,而客户端的字符集为GBK
另外,我们还可以执行如下的语句来确保上述的操作是正确的:
SELECT * FROM v$nls_parameters;
由于上述数据库服务器是部署在Windows上的,因此其结果自然为GBK,因此如果我们客户端使用UTF8字符集进行解码,自然而言会出现解码的错误。
我们需要注意的是,只有在数据库服务器端与客户端的编码一致的情况下,我们才能正常的显示非ASCII编码,而在sqlalchemy中默认会将查询的字符串强制将其转换为Unicode。因此类似Python3的如下过程:
>>> a=’中国’.encode(’gbk’) >>> a
b’\xd6\xd0\xb9\xfa’
而在sqlalchemy中由于强制进行编码转换,因此类似执行如下的过程:
>>> a.decode(’utf-8’)
Traceback (most recent call last):
File "", line 1, in <module> UnicodeDecodeError: ’utf-8’ codec can’t decode byte 0xd6 in position 0: invalid continuation byte
因此就出现上述的问题了。而正常的情况应该指定其编码为GBK:
>>> a.decode(’gbk’) ’中国
而设定 NLS_LANG 就是相当于修改上述的编码为GBK

来源:The kite in the wind

使用Python解决Cx_Oracle查询时UnicodeDecodeError的问题

标签:

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
jiangjie190
加入时间:2016-02-19
  关注此人  发短消息
文章分类
jiangjie190”关注的人------(0
jiangjie190”的粉丝们------(0
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!