我有一个机器人脚本,该脚本可以从sql文件中插入一些sql语句;其中一些语句包含utf8字符。如果我使用navicat工具将此文件手动插入数据库,一切都很好。但是,当我尝试使用机器人框架的数据库库执行此文件时,utf8字符会发疯!
这是我的utf8包含的sql语句:
INSERT INTO "MY_TABLE" VALUES (2, '鬲爻鬲1');
这是我使用数据库库的方式:
Connect To Database Using Custom Params cx_Oracle ${dbConnection} Execute Sql Script ${sqlFile} Disconnect From Database
这是我在数据库中得到的:
锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 1
我尝试cx_Oracle直接使用执行SQL文件,但仍然失败!原始库中似乎有问题。这是我用于导入SQL文件的内容:
cx_Oracle
import cx_Oracle if __name__ == "__main__": dsn_tns = cx_Oracle.makedsn(ip, port, sid) db = cx_Oracle.connect(username, password, dsn_tns) sql_commands = open(sql_file_addr, 'r').read().split(";") cr = db.cursor() for command in sql_commands: if not command in ["", "\t", "\n", "\r", "\n\r", "\r\n", None]: print "Executing SQL command:", command cr.execute(command) db.commit()
我发现我可以在连接字符串中定义字符集。我已经为mysql数据库完成了该任务,并且该框架成功地将UTF8字符插入了数据库;这是我的MySQL连接字符串:
mysql
database='db_name', user='db_username', password='db_password', host='db_ip', port=3306, charset='utf8'
但是我不知道如何为Oracle连接字符串定义字符集。我已经试过了:
'db_username','db_password','db_ip:1521/db_sid','utf8'
我有这个错误:
TypeError: an integer is required
正如@Yu Zhang所建议的那样,我阅读了此链接中的讨论,发现要设置一个环境变量NLS_LANG才能UTF-8与数据库建立连接。因此,我在测试设置中添加了以下内容:
NLS_LANG
UTF-8
os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"