<h1>CX_ORACLE汉字乱码的处理</h1>

   环境: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数据库字符集能成功的原理:

猜你喜欢

转载自www.cnblogs.com/Afisher/p/9403820.html
h1