python使用cx_Oracle连接oracle中文乱码处理

1.1 python连接oracle中文乱码

背景
遇到对接的系统可能是比较老旧的项目了使用的是oracle数据库,版本是Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
比较恶心的是字符集使用的是US7ASCII,然后发现查询插入中文字符都是乱码。
处理过程中踩了很多坑,浪费了很多时间,这里直接处理方法放出来,希望能帮到你,如果帮到你了麻烦请点个赞

1.1.1 数据库信息查询

可以先执行如下sql
SELECT * FROM NLS_DATABASE_PARAMETERS
看看其中的NLS_CHARACTERSET参数估计大概率是US7ASCII

网上说的好多方法如下都没有用:

  1. os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.US7ASCII'
  2. 创建连接是添加encoding:conn = cx_Oracle.connect(user='system', password='oracle', dsn=dsn, encoding="UTF-8")

1.1.2 查询数据中文乱码处理

使用utl_raw.cast_to_raw将有中文的字段转成原始字节数据格式

  
# 准备SQL语句和绑定变量  
sql = """  
sql = """  
select  ID,  
        utl_raw.cast_to_raw(NAME) as NAME,
        utl_raw.cast_to_raw(VALUE) as VALUEfrom HR.CESHI  
order by ID  
"""
cursor.execute(sql)
columns = [col[0] for col in cursor.description]
datas = []
for row in cursor.fetchall():
    data = {}
    for i, v in enumerate(row):
        column = columns[i]
        if v:
            v = v.decode('GBK', errors="ignore")
        data[column] = v
    datas.append(data)
print(datas)

然后再对查询结果使用decode('GBK')解码成字符串看看
有报错加上ignore参数忽略掉报错decode('GBK', errors="ignore"),估计只有很少部分特殊字符转不过来?具体不清楚,绝大部分都可以转换成功

1.1.3 插入数据中文乱码处理

使用utl_raw.cast_to_varchar2函数,将编码后的字节数据,通过对应的编码转换为字符串

sql = """  
INSERT INTO HR.CESHI  
(ID, NAME, VALUE)  
VALUES (HR.SEQ_CESHI_ID.NEXTVAL, utl_raw.cast_to_varchar2(:name), utl_raw.cast_to_varchar2(:value)  
)  
"""  
values = {  
    "name": "测试001".encode('GBK'),  
    "value": "件".encode('GBK')  
}  
cursor.execute(sql, values)
posted @ 2024-12-10 17:26  乔木长歌  阅读(9)  评论(0编辑  收藏  举报