2017-10-18 57 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'; 

設置這些全球被迫會話變量爲相同的值。問題解決了。

相關問題