使用Python2.7连接oracle11(解决中文乱码问题)

太难配置了,一个不小心就乱码,记录一下

环境:

客户机: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)

下载地址:https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html

解压到文件夹,我的是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()
发布了31 篇原创文章 · 获赞 11 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/MrRight17/article/details/89505356