太难配置了,一个不小心就乱码,记录一下
环境:
客户机:windows10 + python 2.7 64bit + instantclient-basic 64bit
服务器:OLE 5.3 32bit + Oracle11gR2 32bit
因为Python是64bit的,所以windows中Oracle的Client组件也要是64bit的。
因为OEL服务器中Oracle版本是11gR2,所以Windows中Client组件也要是11gR2的。
使用pip安装Oracle的python包(如果安装不上,使用管理员权限安装)。
pip install cx_Oracle
下载windows中Client组件。(instantclient-basic-windows.x64-11.2.0.4.0.zip)
解压到文件夹,我的是E:\Oracle\instantclient_11_2\。
设置系统环境变量Path
查询OEL服务器中Oracle的语言。
在windows中设置NLS_LANG环境变量。
windows中配置TNS,保存在E:\Oracle\TNS_ADMIN\tnsnames.ora。
# Generated by Oracle configuration tools.
实例名 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OEL服务器地址)(PORT = Oralce端口号))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = 服务名)
)
)
windows中配置TNS_ADMIN环境变量。
重启windows,使环境变量生效。
使用SecureCRT 8.0.0 64bit连接OEL,修改字符集(这里一定要改,不然录入的中文数据编码有问题,后面使用代码读出来的数据,转换也会有问题)。
可以直接远程OEL并录入中文数据,而且不会乱码。
编写python代码
# -*- coding:utf-8 -*-
import socket
import cx_Oracle
# python2.7环境默认不是utf-8,修改默认环境utf-8,最前面的那个表示使用utf-8格式保存代码(好像是)
import sys
reload(sys)
sys.setdefaultencoding('utf8')
szUsername = '连接Oracle的用户名'
szPasswd = '连接Oracle的密码'
szHostname = 'OEL服务器的域名'
szPort = '端口号'
szInstance = '实例名'
# sql语句,这里我有个site表(id, name, address),name字段用的nvarchar2(15)类型
id = 20
# 插入的数据需要转换
name = '公司'.decode('utf8').encode('gbk')
# 插入数据
sql1 = "insert into site(id, name, address) values(%d, '%s', '%s')" % (id, name, '')
# 提交
sql2 = "commit"
# 查询插入的数据
sql3 = "select * from site where id = %d" % (id)
# 把OEL域名解析成IP
szIPAddr = socket.getaddrinfo(szHostname, None)[0][4][0]
db = cx_Oracle.connect(szUsername, szPasswd, szIPAddr + ':' + szPort + '/' + szInstance)
cursor = db.cursor()
# 插入数据
cursor.execute(sql1)
# 提交
cursor.execute(sql2)
# 查询插入的数据
cursor.execute(sql3)
# 得到返回结果
sqlRet = cursor.fetchall()
# 打印结果此时看到的中文数据为u'\u****\u****'
print sqlRet
# 转换中文数据为GBK
print sqlRet[0][1].encode('gbk')
cursor.close()
db.close()