问题描述:
在Python中使用cx_Oracle模块链接Oracle数据库时,有可能会遇到乱码问题。乱码表现为从Oracle中获取中文字符时无法正常显示,显示为一堆乱码。
解决方法:
出现乱码的原因是字符编码不匹配。需要将从Oracle数据库中获取的数据从Oracle编码转换成Python中的Unicode编码。可以通过cx_Oracle模块提供的makedsn()
、connect()
方法以及Oracle的NLS_LANG
设置来解决。
具体步骤如下:
1.设置环境变量NLS_LANG
在Python代码运行前先设置NLS_LANG
变量,将其值设置为连接的Oracle数据库中文字符集,如AMERICAN_AMERICA.ZHS16GBK
,可以使用以下代码设置:
import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.ZHS16GBK'
2.获取Oracle数据库的dsn
使用cx_Oracle的makedsn()
方法获取Oracle数据库的dsn
,该方法有三个参数,分别为host
,port
和service_name
:
import cx_Oracle
dsn = cx_Oracle.makedsn('localhost', 1521, 'ORCL')
3.连接Oracle数据库
使用cx_Oracle的connect()
方法连接Oracle数据库,将获取到的dsn
作为参数传入。将连接的字符集设置为UTF-8
:
conn = cx_Oracle.connect('username', 'password', dsn, encoding='UTF-8')
4.执行SQL语句
使用连接对象的cursor()
方法创建游标对象,执行SQL语句:
cursor = conn.cursor()
sql = 'SELECT * FROM table'
cursor.execute(sql)
result = cursor.fetchall()
5.处理乱码
从Oracle数据库中读取的数据是以Oracle编码的格式返回的,使用decode()
方法将其转换为Python中的Unicode编码:
for row in result:
print(row[0].decode('GBK'))
示例一:读取Oracle数据库中的中文数据
import os
import cx_Oracle
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.ZHS16GBK'
dsn = cx_Oracle.makedsn('localhost', 1521, 'ORCL')
conn = cx_Oracle.connect('username', 'password', dsn, encoding='UTF-8')
cursor = conn.cursor()
sql = 'SELECT * FROM table'
cursor.execute(sql)
result = cursor.fetchall()
for row in result:
print(row[0].decode('GBK'))
示例二:插入中文数据到Oracle数据库中
import os
import cx_Oracle
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.ZHS16GBK'
dsn = cx_Oracle.makedsn('localhost', 1521, 'ORCL')
conn = cx_Oracle.connect('username', 'password', dsn, encoding='UTF-8')
cursor = conn.cursor()
sql = "INSERT INTO table (column1, column2) VALUES (:1, :2)"
data = ("中文1", "中文2")
cursor.execute(sql, data)
conn.commit()
cursor.close()
conn.close()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决python通过cx_Oracle模块连接Oracle乱码的问题 - Python技术站