¿Cómo puedo insertar caras sonrientes en MySQL (😊)

18

Estoy en MySQL 5.5.21 e intento insertar el carácter de carita sonriente '\ xF0 \ x9F \ x98 \ x8A'. Pero por mi vida, no puedo entender cómo hacerlo.

De acuerdo con varios foros que he estado leyendo, es posible. Pero cada vez que lo intento, los datos simplemente se truncan.

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)

Pero la definición de mi tabla es la siguiente.

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 

Se puede ver que estoy usando CHARSET = utf8mb4. ¿Seguramente esto corrige problemas relacionados con el uso de caracteres de varios bytes?

Ok, entonces no me di cuenta:

  `content` text CHARACTER SET utf8 NOT NULL,

Lo he corregido ahora, pero aún así obtengo resultados funky.

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 |
 +--------+-------+-----------------------+
Bryan Hunt
fuente
Estoy borrando todos los caracteres especiales en la capa de aplicación ahora, por lo que no es un gran problema para mí. Pero, me gustaría saber si es posible de alguna manera obtener los datos dentro y fuera de MySQL.
Bryan Hunt
No soy un chico de MySQL, pero no se puede especificar uft8para el TEXTcampo también
JNK
¿has ejecutado los nombres de conjunto utf8mb4; de su cliente antes de emitir el inserto?
atxdba
JNK, el campo de texto está usando la tabla predeterminada, en este caso utf8mb4.
Bryan Hunt
atxdba. Gracias por la sugerencia, todavía sale como?, Lo que presumiblemente significa corrupto. ¡Malditos sean esos emoticones / decepticons! ;)
Bryan Hunt

Respuestas:

22

Recientemente escribí una guía detallada sobre cómo cambiar de MySQL utf8autf8mb4 . Si sigue los pasos allí, todo debería funcionar correctamente. Aquí hay enlaces directos a cada paso individual en el proceso:

Sospecho que su problema puede resolverse siguiendo el paso 5. ¡Espero que esto ayude!

Mathias Bynens
fuente
1
Dejé ese trabajo por lo que no puedo probarlo / verificarlo. Sin embargo, sospecho que la configuración collation-server = utf8mb4_unicode_ci es lo que faltaba. Buen tutorial!
Bryan Hunt
Muy bien Mathias. Un recordatorio para las personas, los detalles de la conexión de su cliente son importantes. Estoy usando el módulo NPM mysqlde Node, y necesitaba especificar charset: 'utf8mb4'en mi createConnection()llamada, de lo contrario, la inserción de caracteres UTF8 verdaderos aún falló con el Incorrect string valueerror, incluso después de convertir la tabla y la columna en utf8mb4conjunto de caracteres y clasificación. Espero que los detalles del nivel de configuración del cliente en el Paso 5 tengan un efecto similar.
Neek
2

Haz lo siguiente:

  1. Establezca el conjunto de caracteres de la base de datos en utf8mb4

  2. Establezca el conjunto de caracteres de la columna en utf8mb4

como abajo consulta:

ALTER TABLE `comments` CHANGE `text` `text` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
Poonam Gupta
fuente
¿Son estos pasos realmente suficientes? La respuesta aceptada tiene muchas más.
Colin 't Hart
Depende de cuál era el problema, si el problema estaba en el lado de la base de datos, esto es suficiente. Pero también puede ser un problema de conexión del cliente.
spydon