【发布时间】:2015-11-25 10:30:27
【问题描述】:
我有一个机器人脚本,它从 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 文件的:
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 连接字符串:
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
【问题讨论】:
-
我不知道robotframework,但我用
AL32UTF8作为第四个参数解决了PHP中oci_connect字符串的类似问题。
标签: sql database utf-8 robotframework