我正在使用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。
答案 0 :(得分:1)
连接需要指定utf8mb4。或SET NAMES utf8mb4
。这是指定客户端字节的编码。
是一个4字节的表情符号。
答案 1 :(得分:0)
Rick James的回答是正确的。从那以后我就能够创建一个适合我的解决方案。
SET NAMES 'utf8mb4';
将3个全局变量设置为seen here。唯一的问题是它只设置 session 变量,因此您必须为每个连接发出此命令。
似乎无法在my.cnf文件的mysqld组中设置这3个变量(我相信这是因为它们无法在命令行设置。请注意定义中缺少的命令行详细信息{ {3}})
相反,我在my.cnf选项文件的mysqld组中设置了here选项。
[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';
设置这些全局会话将会话变量强制为相同的值。问题解决了。