我必须更新现有脚本,以便将一些数据写入Oracle 10g数据库。脚本和数据库都在同一台Solaris 10(Intel)计算机上运行。 Python是v2.4.4。
我正在使用cx_Oracle并且可以读取/写入数据库没有问题。但我写的数据包含重音字符,这些字符无法正确编写。重音字符变成了一个颠倒的问号。
使用此代码从二进制文件中读取值:
class CustomerHeaderRecord:
def __init__( self, rec, debug = False ):
self.record = rec
self.acct = rec[ 84:104 ]
acct
变量的内容正确显示在屏幕上。
下面是写入db的代码(acct
值作为val_1
变量传入):
class MQ:
def __init__( self, rec, debug = False ):
self.customer_record = CustomerHeaderRecord( rec, debug )
self.add_record(self.customer_record.acct, self.cm_custid)
def add_record(self, val_1, val_2):
cur = conn.cursor()
qry = "select count(*) from table_name where value1 = :val1"
cur.execute(qry, {'val1':val_1})
count = cur.fetchone()
if count[0] == 0:
cur = conn.cursor()
qry = "insert into table_name (value1, value2) values(:val1, :val2)"
cur.execute(qry, {'val1':val_1, 'val2':val_2})
conn.commit()
acct
值无法正确进入数据库。我用谷歌搜索了一些关于unicode和UTF-8的东西,但还没找到任何对我有帮助的东西。在数据库中,NLS_LANGUAGE是'American',NLS_CHARACTERSET是'AL32UTF8'。
在插入之前/期间,我是否需要与acct
变量“做某事”?
答案 0 :(得分:2)
您的输入文件似乎是以Latin-1编码。将此解码为unicode
数据; cx_Oracle将为您完成剩下的工作:
acct = rec[ 84:104 ].decode('latin1')
或使用codecs.open()
function打开文件进行自动解码:
inputfile = codecs.open(filename, 'r', encoding='latin1')
从inputfile
阅读将为您提供unicode
个数据。
在插入时,cx_Oracle
库会将unicode
值编码为Oracle期望的正确编码。 做需要在连接之前将NLS_LANG
环境变量设置为AL32UTF8
,无论是在shell中还是在Python中:
os.environ["NLS_LANG"] = ".AL32UTF8"
您可以查看Python Unicode HOWTO了解详情。