2017-10-18 54 views
0

我正在使用Python mysql连接器模块将unicode字符点128049(U + 1F431)插入到mariaDB sql表中。不正确的字符串值错误 - Python + mariaDB

我的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)) 

由于这是它需要4个字节的plane 1 unicode value,但改变表和列到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

里克詹姆斯答案是正确的。从那以后,我能够创建一个适合我的解决方案。

SET NAMES 'utf8mb4'; 

将3个全局变量设置为seen here。唯一的问题是这只会设置会话变量,所以你必须为每个连接发出这个命令。

似乎不可能在my.cnf文件的mysqld组中设置这3个变量(我相信这是因为它们不能在命令行中设置,请注意定义中缺少的命令行详细信息here

取而代之,我将init_file选项设置在my.cnf选项文件的mysqld组中。

[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'; 

设置这些全球被迫会话变量为相同的值。问题解决了。

相关问题