Comment puis-je insérer des visages souriants dans MySQL (😊)


18

Je suis sur MySQL 5.5.21, et j'essaye d'insérer le caractère de visage souriant '\ xF0 \ x9F \ x98 \ x8A'. Mais pour la vie de moi, je ne peux pas comprendre comment le faire.

Selon divers forums que j'ai lus, c'est possible. Mais chaque fois que je l'essaye, les données sont simplement tronquées.

mysql> INSERT INTO hour  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  
       `indegree` ,  `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   
       VALUES ( "title" ,  "content 😊  content" ,  "guid" ,  1,  1,   
                     "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level   | Code | Message                                                                       |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
| Warning | 1265 | Data truncated for column 'published' at row 1                                |
+---------+------+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|           687302 |
+------------------+
1 row in set (0.00 sec)

mysql> select * from hour where id = 687302;
+--------+-------+----------+------+---------------------+
| id     | title | content  | guid | published           |
+--------+-------+----------+------+---------------------+
| 687302 | title | content  | guid | 0000-00-00 00:00:00 |
+--------+-------+----------+------+---------------------+
1 row in set (0.00 sec)

Mais ma définition de table est la suivante.

CREATE TABLE `hour` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text CHARACTER SET utf8 NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687560 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 

On peut voir que j'utilise CHARSET = utf8mb4. Cela corrige-il sûrement les problèmes liés à l'utilisation de caractères multi-octets?

Ok, donc je n'ai pas remarqué:

  `content` text CHARACTER SET utf8 NOT NULL,

J'ai corrigé cela maintenant, mais j'obtiens toujours des résultats géniaux.

CREATE TABLE `hourtmp` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 NOT NULL,
  `content` text NOT NULL,
  `guid` varchar(255) CHARACTER SET utf8 NOT NULL,
  `published` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lang` tinyint(3) unsigned NOT NULL,
  `type` enum('WEBLOG','MICROBLOG') CHARACTER SET utf8 DEFAULT NULL,
  `indegree` int(4) unsigned NOT NULL,
  `lon` float DEFAULT NULL,
  `lat` float DEFAULT NULL,
  `state` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `country` varchar(50) CHARACTER SET utf8 DEFAULT '',
  `hour` int(2) DEFAULT NULL,
  `gender` enum('MALE','FEMALE') CHARACTER SET utf8 DEFAULT NULL,
  `time_zone` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MEMORY AUTO_INCREMENT=687563 DEFAULT CHARSET=utf8mb4 KEY_BLOCK_SIZE=288 |

 mysql> INSERT INTO hourtmp  (  `title`,   `content`,   `guid` ,  `published` , `lang` ,  `type` ,  `indegree` ,  
 `lon` ,  `lat` ,  `state` ,  `country` , `hour`  )   VALUES ( "title" ,  "content 😊  content" ,  
 "guid" ,  1,  1,   "WEBLOG",  1,  1,  1,  "state" ,  "country" ,  1 );
 Query OK, 1 row affected, 2 warnings (0.00 sec)

 mysql> show warnings;

 | Level   | Code | Message                                                                       |

 | Warning | 1366 | Incorrect string value: '\xF0\x9F\x98\x8A  ...' for column 'content' at row 1 |
 | Warning | 1265 | Data truncated for column 'published' at row 1                                |

 2 rows in set (0.00 sec)

 mysql> select * from hourtmp;
 +--------+-------+-----------------------+
 | id     | title | content               |
 +--------+-------+-----------------------+
 | 687560 | title | content ????  content |
 | 687561 | title | content ????  content |
 +--------+-------+-----------------------+

J'efface tous les caractères spéciaux dans la couche d'application maintenant, donc ce n'est pas vraiment un problème pour moi. Mais, je voudrais savoir s'il est possible de faire entrer et sortir les données de MySQL.
Bryan Hunt

Pas un gars de MySQL, mais ne pouvez-vous pas également spécifier uft8pour le TEXTchamp
JNK

avez-vous exécuté les noms de set utf8mb4; de votre client avant d'émettre l'insert?
atxdba

JNK, le champ de texte utilise la table par défaut, dans ce cas utf8mb4.
Bryan Hunt

atxdba. Merci pour la suggestion, apparaît toujours comme?, Ce qui signifie probablement corrompu. Merde ces émoticônes / trompeuses! ;)
Bryan Hunt

Réponses:


22

J'ai récemment écrit un guide détaillé sur la façon de passer de MySQL utf8àutf8mb4 . Si vous suivez les étapes, tout devrait fonctionner correctement. Voici des liens directs vers chaque étape individuelle du processus:

Je soupçonne que votre problème peut être résolu en suivant l'étape 5. J'espère que cela vous aidera!


1
Ont quitté ce travail donc incapable de tester / vérifier. Cependant, je soupçonne que le paramètre collation-server = utf8mb4_unicode_ci est ce qui manquait. Bon tutoriel!
Bryan Hunt

Très gentil Mathias. Un rappel aux gens, les détails de votre connexion client sont importants. J'utilise le module NPM mysqlde Node et charset: 'utf8mb4'je devais le spécifier dans mon createConnection()appel, sinon l'insertion de vrais caractères UTF8 a toujours échoué avec l' Incorrect string valueerreur, même après la conversion de la table et de la colonne en utf8mb4jeu de caractères et en collation. Je m'attends à ce que les détails du niveau de configuration de votre client à l'étape 5 aient un effet similaire.
Neek

2

Faites les choses suivantes:

  1. Définissez le jeu de caractères de la base de données sur utf8mb4

  2. Définissez le jeu de caractères de la colonne sur utf8mb4

comme ci-dessous requête:

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

Ces étapes sont-elles vraiment suffisantes? La réponse acceptée en a beaucoup plus.
Colin 't Hart

Dépend de ce qu'était le problème, si le problème était du côté de la base de données, cela suffit. Mais cela peut aussi très bien être un problème de connexion client.
spydon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.