环境: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