2017-10-18 23 views
0

私はPython mysql-connectorモジュールを使用して、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)) 

このplane 1 unicode valueあるので、それは4つのバイトを必要とするが、テーブルやカラムを変更するas suggested hereをutf8mb4しますうまくいかなかった。

私は取得していますエラーは次のとおりです。

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

と比較すると、挿入される文字列が正しいになります

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

mariadbこのバージョンのsql_modeのは、デフォルトでは厳密ではありません。厳密なモードを指定しないと挿入が機能しますが、文字はデフォルトの '?'に変換されます。キャラクター。

私はSQLがこれが無効な文字列であると思う理由を理解できません。

私はmariadb 10.1.9にPython 3.6.1のmysql-connector 2.1.4で接続しています。

答えて

1

接続にはutf8mb4を指定する必要があります。またはSET NAMES utf8mb4。これは、クライアントのバイトのエンコーディングを指定するためです。

は、4バイトの絵文字です。

よりPythonのヒント:http://mysql.rjweb.org/doc.php/charcoll#python

0

リック・ジェームスの答えが正解です。それから私は私のために働く解決策を作り出すことができました。

SET NAMES 'utf8mb4'; 

3つのグローバル変数をseen hereと設定します。唯一の問題は、セッションの変数を設定するだけなので、すべての接続でこのコマンドを発行する必要があります。

これら3つの変数をmy.cnfファイルのmysqldグループに設定することはできません(これはコマンドラインでは設定できないためです)。 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'; 

がグローバルに同じ値にセッション変数を余儀なくされました。問題が解決しました。

関連する問題