【问题标题】:Issue with executing QSqlQuery on MySQL table in PyQt5在 PyQt5 中对 MySQL 表执行 QSqlQuery 的问题
【发布时间】:2017-04-30 11:46:23
【问题描述】:

我认为我在使用 PyQt5 时遇到了初学者问题。我想在 MySQL 数据库上运行查询。我的查询字符串包含国际字符,如“ąśćźż”。

我正在使用Python 3.6.1、MySQL 5.7.18 和PyQt 5.8.2。

我的部分代码:

db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("127.0.0.1")
db.setUserName("root")
db.setPassword("xxxxxx")
db.setDatabaseName("test")
db.setPort(3306)
if db.isOpen() != True:
    db.open()

query = QSqlQuery()
query.exec_("INSERT INTO table1 (id) VALUES ('ąśćźżęłó1');")
db.close()
print(query.lastError().text())
print(query.lastQuery())

输出: Incorrect string value: '\xB9\x9C\xE6\x9F\xBF\xEA...' for column 'id' at row 1 QMYSQL: Unable to execute query INSERT INTO table1 (id) VALUES ('ąśćźżęłó1');

表的创建语句:

CREATE TABLE `table1` (
  `id` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

mysql 中的所有字符集和排序规则变量都设置为 utf8mb4。

当我使用 PyQt5 以外的其他包连接到数据库时 - PyMySQL,我没有遇到这个问题。在PyMySQL 中,我建立了与charset = "utf8mb4" 的连接作为连接字符串的一部分。我现在不知道如何用QSqlDatabase 重新喜欢这个。

你能帮我解决这个问题吗?

【问题讨论】:

    标签: python mysql utf-8 pyqt5


    【解决方案1】:

    十六进制看起来可能是cp1250-encoded。找出字节来自哪里,也许是终端,也许是一个 html 表单,也许是你的 python。这是我的notes on Python;可能第一行是问题所在。也许其他提示之一就是问题所在。

    对于 utf8mb4(或 utf8),ąśćźżęłó1 应为十六进制 C485 C59B C487 C5BA C5BC C499 C582 C3B3 31
    对于 cp1250,我希望使用十六进制 B9 9C E6 9F BF EA B3 F3 31

    【讨论】:

    • 您的一个提示是“使用 MySQL 连接器/Python 而不是 pyodbc 和 MySQL 连接器/ODBC”。当我使用 QSqlDatabase 时,我看不到在连接中设置“charset”的选项。当我使用其他库,如 pymysql,我可以为连接设置“charset”,并且可以成功使用数据库。所以我没有得到解决方案,而是暂时的解决方法。
    • 请提供解决方法代码,以便我更新提示。
    【解决方案2】:

    在 sqlserver 上,你需要在你的 unicode 字符串前面放一个 U:

    会不会是同样的问题?

    query.exec_("INSERT INTO table1 (id) VALUES (N'ąśćźżęłó1');")

    (编辑 2017-05-02:我弄错了,N 是要放置的前缀)

    【讨论】:

    • 那行不通。通常我不需要将任何东西作为前缀来插入 unicode 字符串。尝试添加“N”前缀后,我收到语法错误通知。
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多