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.