Come posso inserire faccine in MySQL (😊)


18

Sono su MySQL 5.5.21 e sto provando a inserire il carattere faccina '\ xF0 \ x9F \ x98 \ x8A'. Ma per la mia vita, non riesco a capire come farlo.

Secondo vari forum che ho letto, è possibile. Ma ogni volta che lo provo, i dati vengono troncati.

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)

Ma la mia definizione di tabella è la seguente.

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 

Si può vedere che sto usando CHARSET = utf8mb4. Sicuramente ciò corregge i problemi relativi all'uso di caratteri multibyte?

Ok, quindi non ho notato:

  `content` text CHARACTER SET utf8 NOT NULL,

L'ho corretto ora, ma ottengo comunque risultati 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 |
 +--------+-------+-----------------------+

Sto cancellando tutti i caratteri speciali nel livello applicazione ora, quindi non è un grosso problema per me. Ma vorrei sapere se è possibile in qualche modo ottenere i dati dentro e fuori da MySQL.
Bryan Hunt,

Non sono un tipo MySQL, ma non puoi specificare anche uft8per il TEXTcampo
JNK l'

hai eseguito nomi impostati utf8mb4; dal tuo cliente prima di emettere l'inserto?
Atxdba,

JNK, il campo di testo utilizza la tabella predefinita, in questo caso utf8mb4.
Bryan Hunt,

atxdba. Grazie per il suggerimento, esce ancora come?, Che presumibilmente significa corrotto. Accidenti a quelle emoticon / decepticon! ;)
Bryan Hunt,

Risposte:


22

Di recente ho scritto una guida dettagliata su come passare da MySQL utf8autf8mb4 . Se segui i passaggi lì, tutto dovrebbe funzionare correttamente. Ecco i collegamenti diretti a ogni singolo passaggio del processo:

Ho il sospetto che il tuo problema possa essere risolto seguendo il passaggio 5. Spero che questo aiuti!


1
Hanno lasciato quel lavoro così incapace di testare / verificare. Tuttavia, sospetto che l'impostazione collation-server = utf8mb4_unicode_ci sia ciò che mancava. Buon tutorial!
Bryan Hunt,

Molto bella Mathias. Un promemoria per le persone, i dettagli della connessione client sono importanti. Sto usando il modulo NPM mysqlda Nodo e charset: 'utf8mb4'ho dovuto specificare nella mia createConnection()chiamata, altrimenti l'inserimento di caratteri UTF8 veri non è riuscito ancora con l' Incorrect string valueerrore, anche dopo aver convertito la tabella e la colonna in utf8mb4set di caratteri e regole di confronto. Mi aspetto che i dettagli del livello di configurazione del cliente nel passaggio 5 abbiano effetti simili.
Neek,

2

Fai le seguenti cose:

  1. Impostare il set di caratteri del database su utf8mb4

  2. Impostare il set di caratteri della colonna su utf8mb4

come sotto query:

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

Questi passaggi sono davvero sufficienti? La risposta accettata ha molti altri.
Colin 't Hart,

Dipende da quale fosse il problema, se il problema era sul lato del database questo è sufficiente. Ma può anche essere un problema di connessione client.
spydon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.