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
网上说的好多方法如下都没有用:
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.US7ASCII'
- 创建连接是添加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)
本文来自博客园,作者:乔木长歌,转载请注明原文链接:https://www.cnblogs.com/qgdtq/p/18597731