2017-10-18 20 views
0

J'utilise le module Python mysql-connector pour insérer le point de caractère Unicode 128049 (U + 1F431) dans une table mariaDB sql.Erreur de valeur de chaîne incorrecte - Python + mariaDB

Ma table SQL est définie comme:

show create table t1; 

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

Et le code python est:

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

Depuis c'est un plane 1 unicode value dont il a besoin de 4 octets, mais en changeant la table et la colonne à utf8mb4 as suggested here n'a pas fonctionné.

L'erreur que je reçois est:

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

La chaîne étant insérée semble correct par rapport à:

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

Le sql_mode pour cette version de MariaDB est pas stricte par défaut. Alors que l'insertion fonctionne quand je ne spécifie pas le mode strict, les caractères sont convertis à la valeur par défaut '?' personnage.

Je n'arrive pas à comprendre pourquoi SQL considère qu'il s'agit d'une chaîne non valide.

Je me connecte à mariadb 10.1.9 via mysql-connector 2.1.4 dans python 3.6.1.

Répondre

0

Rick James réponse est correcte. De cela j'ai pu créer une solution qui a fonctionné pour moi.

SET NAMES 'utf8mb4'; 

Définit 3 variables globales comme seen here. Le seul problème est que cela ne définit que session variables de sorte que vous devez exécuter cette commande pour chaque connexion.

Il ne semble pas possible de définir ces 3 variables dans le groupe mysqld du fichier my.cnf (je crois que c'est parce qu'elles ne peuvent pas être définies en ligne de commande.) Notez le détail de ligne de commande manquant dans les définitions here)

Au lieu de cela, j'ai défini l'option init_file dans le groupe mysqld du fichier d'options my.cnf.

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

Dans ce fichier, je mis les 3 variables:

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

La définition de ces contraintes au niveau mondial les variables de session à la même valeur. Problème résolu.