Python-解决Cx_Oracle查询时UnicodeDecodeError的问题
近期在项目中,要对1张100多万条记录的表进行查询,然后进行一些数据的统计,但是在这个过程中,发现只查询出来几条数据就出现了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条记录就出现了1个UnicodeDecodeError错误了。
本来以为是数据库的服务器编码问题,因此在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数据库(个人喜欢Postgresql多一些)的时候,出现乱码的时候,我们常常会进行如下的操作:
set names gbk;
我们通过这种方式设置客户端的编码,而不是服务器端的编码,来解决终端下出现乱码的情况(由于Postgresql默认数据库就是UTF-8因此出现乱码的可能性较低)。而另外在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 "<stdin>", 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。
更多Python-解决Cx_Oracle查询时UnicodeDecodeError的问题 相关文章请关注PHP中文网!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

VS Code 可用于编写 Python,并提供许多功能,使其成为开发 Python 应用程序的理想工具。它允许用户:安装 Python 扩展,以获得代码补全、语法高亮和调试等功能。使用调试器逐步跟踪代码,查找和修复错误。集成 Git,进行版本控制。使用代码格式化工具,保持代码一致性。使用 Linting 工具,提前发现潜在问题。

VS Code 扩展存在恶意风险,例如隐藏恶意代码、利用漏洞、伪装成合法扩展。识别恶意扩展的方法包括:检查发布者、阅读评论、检查代码、谨慎安装。安全措施还包括:安全意识、良好习惯、定期更新和杀毒软件。

在 Notepad 中运行 Python 代码需要安装 Python 可执行文件和 NppExec 插件。安装 Python 并为其添加 PATH 后,在 NppExec 插件中配置命令为“python”、参数为“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通过快捷键“F6”运行 Python 代码。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。
