CX_ORACLE汉字乱码的处理

本文介绍了一种在Oracle数据库中转换字符集的方法,确保从WE8ISO8859P1到ZHS16GBK的转换过程中汉字能够正常显示。通过实际操作步骤,包括临时改变数据库和操作系统设置来实现跨字符集数据导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   环境:Python3.x+cx_Oracle6.x

   结论:只要 客户端的NLS_LANG设置与oracle数据库服务器的一致,且NLS_LANG不为WE8ISO8859P1,则汉字显示正常。

    故有必要将字符集为WE8ISO8859P1的oracle数据库,改为ZHS16GBK、UTF8等。实在不能修改字符集的话,则凡是出现汉字的地方,都要进行转码:x.encode('latin1').decode('gbk')   ——x为数据库里有汉字的字段。

 

      本人亲测:

  oracle数据库的原字符集为ZHS16GBK,将其改为WE8ISO8859P1,以便导入字符集为WE8ISO8859P1的dmp文件;导入后再将oracle数据库的字符集改回,汉字显示正常:

  1、 将老oracle的数据导出,字符集编码为WE8ISO8859P1

  2、新oracle数据服务器本身的编码为 ZHS16GBK。为导入编码为WE8ISO8859P1的dmp文件,临时改为 WE8ISO8859P1。并修改os的注册表或环境变量,使NLS_LANG=WE8ISO8859P1。然后重启oracle服务。

  3、导入 dmp文件(其真实的字符集亦为WE8ISO8859P1)。若在 客户机使用 imp 导入,注意客户机的NLS_LANG,务必是 WE8ISO8859P1。

  4、将oracle数据库的字符集改回 ZHS16GBK,修改os的注册表或环境变量,使NLS_LANG= ZHS16GBK。然后重启oracle服务。

  5、查询:汉字正常。

 

  注一:exp导出的包,直接修改对应的字节,可以骗过imp程序:导入时不报错。但是读取时,汉字乱码。

 

   注二:网上高手说的修改oracle数据库字符集能成功的原理:

 

转载于:https://www.cnblogs.com/Afisher/p/9403820.html

### 如何解决 Cx_Oracle 连接时遇到的字符乱码问题 #### 客户端和服务端环境为何使用 US7ASCII 字符集? US7ASCII 是一种常见的 ASCII 扩展字符集,在 Oracle 数据库环境中广泛使用。当客户端和服务端都配置为 US7ASCII 时,可以确保两者之间的字符编码一致,从而减少因字符集不匹配而导致的数据传输错误。 #### 解决方案一:连接时指定字符集 通过在 `cx_Oracle` 的连接参数中显式指定期望使用的字符集来解决问题: ```python import cx_Oracle dsn_tns = cx_Oracle.makedsn('host', 'port', service_name='service') connection = cx_Oracle.connect( user='username', password='password', dsn=dsn_tns, encoding='US7ASCII' ) ``` 这种方式能够强制客户端按照服务端设定的字符集进行通信[^1]。 #### 解决方案二:设置系统字符集 另一种方法是在操作系统级别设置 NLS_LANG 环境变量,这会影响整个系统的 Oracle 应用程序行为: ```bash export NLS_LANG=.US7ASCII ``` 此操作使得所有基于该环境启动的应用都会遵循相同的字符集规则[^2]。 #### 输出类型处理器调整 对于特定场景下的中文乱码情况,还可以利用 `outputtypehandler` 来定制化处理返回的结果集中的字符串对象。具体实现如下所示: ```python def output_type_handler(cursor, name, defaultType, size, precision, scale): if defaultType in (cx_Oracle.STRING, cx_Oracle.FIXED_CHAR): return cursor.var(str, arraysize=cursor.arraysize) connection.outputtypehandler = output_type_handler ``` 这种方法特别适用于那些即使设置了正确的输入字符集仍然存在显示异常的情况[^3]。 #### Web应用特殊处理 如果是在 ASP.NET 或其他 web 平台下访问 Oracle,则可以通过修改应用程序配置文件(如 web.config),添加 `Unicode=True` 参数到数据库连接串中简化问题处理流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值