【问题标题】:how to insert utf8 characters into oracle database using robotframework database library如何使用robotframework数据库库将utf8字符插入oracle数据库
【发布时间】: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


【解决方案1】:

正如@Yu Zhang 所建议的,我阅读了link 中的讨论,我发现我应该设置一个环境变量NLS_LANG 以便UTF-8 连接到数据库。所以我在我的测试设置中添加了以下行:

os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"

【讨论】:

    【解决方案2】:

    下面的链接有帮助吗?

    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
    

    【讨论】:

    • 感谢您的链接,但我对机器人框架有问题,而不是 oracle!我可以将utf8字符插入数据库,但是当我通过机器人脚本执行我的sql文件时,字符没有成功导入。
    • 谢谢,我再次尝试了您的链接中的解决方案,最后其中一个对我有用。
    【解决方案3】:

    这里可能有几个问题...

    第一个问题可能是您没有使用 UTF-8 编码保存测试文件。

    Robot 框架要求纯文本测试文件使用 UTF-8 编码保存,但大多数文本编辑器默认不会使用 UTF-8 保存。

    验证您的编辑器是否以这种方式保存 - 例如,使用 NotePad++ 打开文件并选择编码 -> UTF-8

    另一个问题可能是与 Oracle 数据库的连接。您似乎无法将连接自定义属性配置为显式声明 UTF-8

    这意味着您可能需要声明数据库架构本身是 UTF-8

    【讨论】:

    • 它与连接属性有关,即使我不知道如何为oracle连接设置连接字符集,您的回答节省了我的时间!但我认为最好等到有人找到最终解决方案!
    猜你喜欢
    • 2011-03-15
    • 2021-02-27
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多