【问题标题】:Incorrect string value error - Python + mariaDB不正确的字符串值错误 - Python + mariaDB
【发布时间】:2018-03-29 21:05:30
【问题描述】:

我正在使用 Python mysql-connector 模块将 unicode 字符点 128049 (U+1F431) 插入到 mariaDB sql 表中。

我的SQL表定义为:

show create table t1;

CREATE TABLE `t1` (
`c1` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

而python代码是:

import mysql.connector as db
conn = db.connect(sql_mode = 'STRICT_ALL_TABLES')
curs = conn.cursor(prepared = True)
curs.execute('insert into t1 (c1) values(%)', chr(128049))

由于这是一个plane 1 unicode value,它需要 4 个字节,但是将表和列更改为 utf8mb4 as suggested here 不起作用。

我得到的错误是:

Incorrect string value: '\xF0\x9F\x90\xB1' for column 'c1' at row 1

与以下内容相比,插入的字符串看起来正确:

chr(128049).encode('utf-8')

这个版本的 mariadb 的 sql_mode 默认不严格。虽然当我没有指定严格模式时插入有效,但字符会转换为默认的“?”字符。

我不明白为什么 SQL 认为这是一个无效的字符串。

我在 python 3.6.1 中通过 mysql-connector 2.1.4 连接到 mariadb 10.1.9。

【问题讨论】:

    标签: python mysql unicode utf-8 mariadb


    【解决方案1】:

    连接需要指定utf8mb4。或SET NAMES utf8mb4。这是为了指定客户端字节的编码。

    ? 是一个 4 字节的表情符号。

    更多 Python 提示:http://mysql.rjweb.org/doc.php/charcoll#python

    【讨论】:

      【解决方案2】:

      Rick James 的答案是正确的。由此我能够创建一个适合我的解决方案。

      SET NAMES 'utf8mb4';
      

      设置 3 个全局变量为 seen here。唯一的问题是这仅设置 session 变量,因此您必须为每个连接发出此命令。

      似乎无法在 my.cnf 文件的 mysqld 组中设置这 3 个变量(我相信这是因为它们无法在命令行中设置。请注意定义中缺少的命令行细节@ 987654322@)

      相反,我在 my.cnf 选项文件的 mysqld 组中设置了 init_file 选项。

      [mysqld]
      init_file=/path/to/file.sql
      

      在该文件中,我设置了 3 个变量:

      set @@global.character_set_client='utf8mb4';
      set @@global.character_set_connection='utf8mb4';
      set @@global.character_set_results='utf8mb4';
      

      将这些全局设置强制会话变量为相同的值。问题解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-04
        • 2012-11-08
        • 1970-01-01
        • 2020-06-07
        • 2012-02-01
        • 2017-03-18
        • 2012-09-20
        相关资源
        最近更新 更多