web-dev-qa-db-fra.com

INSERT donne le code d'erreur: 1366. Valeur de chaîne incorrecte: '\ xF0 \ x9F \ x98 \ x80' pour la colonne

Je rencontre des problèmes avec la structure de ma table:

My_Table_Name1

 CREATE TABLE `My_Table_Name1` (
` Twitter_id_str` varchar (255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
 `Twitter_screen_name` varchar (512) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
 CLÉ UNIQUE `Twitter_id_str` (` Twitter_id_str`) 
) MOTEUR = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci 

Pour la base de données, j'ai également le même jeu de caractères et le même classement:

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

J'essaie d'insérer un emoji dans ce tableau:

insert into My_Table_Name1 values("2","????") 

Cependant, j'obtiens une erreur:

Code d'erreur: 1366. Valeur de chaîne incorrecte: '\ xF0\x9F\x98\x80' pour la colonne 'Twitter_screen_name' à la ligne 1 0,00027 sec

Comment résoudre ça?

Merci d'avance.

3
RAJ KASHWAN

Le problème semble être dans le client.

Lorsque le client se connecte au serveur MySQL, il doit annoncer que les octets du client sont utf8mb4. Cela peut se faire de plusieurs manières:

  • Dans les paramètres de connexion (en fonction du client).
  • SET NAMES utf8mb4.

\U+1F600 est la représentation Unicode de cet Emoji.
\xF0\x9F\x98\x80 est l'équivalent Hex.
F09F9880 est l'UTF-8 (utf8mb4) en hexadécimal.

Évitez la représentation Unicode.

3
Rick James

Cela semble être un problème avec mysql-workbench (testé avec la version 6.3.9 sur Fedora et MySQL 5.7 (CentOS)) où les emojis ne sont pas convertis en unicode correct.

Dans la ligne de commande mysql client, les emojis sont convertis en codes lorsqu'ils sont collés, donc la requête

INSERT INTO My_Table_Name1 values("2","????"); 

devient:

INSERT INTO My_Table_Name1 values("4","\U+1F600");

qui fonctionne bien.

Cependant, dans mysql-workbench, l'emoji n'est pas converti lorsque vous le collez et le résultat de la requête est:

Code d'erreur: 1366. Valeur de chaîne incorrecte: "\ xF0\x9F\x98\x80" pour la colonne "Twitter_screen_name" à la ligne 1

1
dbdemon