如何使用robotframework数据库库将utf8字符插入到oracle数据库中
how to insert utf8 characters into oracle database using robotframework database library
我有一个机器人脚本,它从 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
下面的链接是否有帮助?
http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm#i1006779
http://www.theserverside.com/news/thread.tss?thread_id=39575
https://community.oracle.com/thread/502949
这里可能有几个问题...
第一个问题可能是您没有使用 UTF-8 编码保存测试文件。
机器人框架要求使用 UTF-8 编码保存纯文本测试文件,但大多数文本编辑器默认情况下不会使用 UTF-8 保存。
验证您的编辑器是否以这种方式保存 - 例如,使用 NotePad++ 打开文件并选择编码 -> UTF-8
另一个问题可能是与 Oracle 数据库的连接。您似乎无法将连接自定义属性配置为显式声明 UTF-8
这意味着您可能需要声明数据库模式本身是 UTF-8
正如@Yu Zhang 所建议的那样,我阅读了此 link 中的讨论,发现我应该设置一个环境变量 NLS_LANG
以便与 UTF-8
建立连接数据库。所以我在测试设置中添加了以下行:
os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"
我有一个机器人脚本,它从 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
下面的链接是否有帮助?
http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm#i1006779
http://www.theserverside.com/news/thread.tss?thread_id=39575
https://community.oracle.com/thread/502949
这里可能有几个问题...
第一个问题可能是您没有使用 UTF-8 编码保存测试文件。
机器人框架要求使用 UTF-8 编码保存纯文本测试文件,但大多数文本编辑器默认情况下不会使用 UTF-8 保存。
验证您的编辑器是否以这种方式保存 - 例如,使用 NotePad++ 打开文件并选择编码 -> UTF-8
另一个问题可能是与 Oracle 数据库的连接。您似乎无法将连接自定义属性配置为显式声明 UTF-8
这意味着您可能需要声明数据库模式本身是 UTF-8
正如@Yu Zhang 所建议的那样,我阅读了此 link 中的讨论,发现我应该设置一个环境变量 NLS_LANG
以便与 UTF-8
建立连接数据库。所以我在测试设置中添加了以下行:
os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"