Как я могу вставить смайлики в MySQL (😊)


18

Я использую MySQL 5.5.21 и пытаюсь вставить символ смайлика '\ xF0 \ x9F \ x98 \ x8A'. Но я не могу понять, как это сделать.

Согласно различным форумам, которые я читал, это возможно. Но всякий раз, когда я пытаюсь это сделать, данные просто усекаются.

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)

Но мое определение таблицы следующее.

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 

Видно, что я использую CHARSET = utf8mb4. Конечно, это исправляет проблемы, связанные с использованием многобайтовых символов?

Итак, я не заметил:

  `content` text CHARACTER SET utf8 NOT NULL,

Я исправил это сейчас, но все равно получаю прикольные результаты.

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 |
 +--------+-------+-----------------------+

Сейчас я стираю все специальные символы в прикладном слое, поэтому для меня это не такая большая проблема. Но я хотел бы знать, возможно ли каким-то образом получить данные в MySQL и из него.
Брайан Хант

Не парень MySQL, но вы не можете указать uft8для этого TEXTполя
JNK

вы запускаете набор имен utf8mb4; от вашего клиента до выдачи вкладыша?
atxdba

JNK, текстовое поле использует таблицу по умолчанию, в данном случае utf8mb4.
Брайан Хант

atxdba. Спасибо за предложение, все еще выходит как?, Что, вероятно, означает, что поврежден. Будь прокляты эти смайлики / десептиконы! ;)
Брайан Хант

Ответы:


22

Недавно я написал подробное руководство о том, как перейти с MySQL utf8наutf8mb4 . Если вы выполните все шаги там, все должно работать правильно. Вот прямые ссылки на каждый отдельный шаг в процессе:

Я подозреваю, что вашу проблему можно решить, выполнив шаг 5. Надеюсь, это поможет!


1
Оставил эту работу, так что не может проверить / проверить. Однако я подозреваю, что параметр collation-server = utf8mb4_unicode_ci - это то, чего не хватало. Хороший учебник!
Брайан Хант

Очень милый Матиас. Напоминание людям, детали подключения вашего клиента имеют значение. Я использую модуль NPM mysqlиз Node, и charset: 'utf8mb4'мне нужно было указать в моем createConnection()вызове, в противном случае вставка истинных символов UTF8 все равно не удалась с Incorrect string valueошибкой, даже после преобразования таблицы и столбца в utf8mb4набор символов и сопоставление. Я ожидаю, что детали вашего уровня конфигурации клиента в Шаге 5 будут иметь аналогичный эффект.
Neek

2

Сделайте следующее:

  1. Установите кодировку базы данных в utf8mb4

  2. Установите кодировку столбца в utf8mb4

как ниже запрос:

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

Эти шаги действительно достаточны? Принятый ответ имеет еще много.
Colin 't Hart

Зависит от того, в чем проблема, если проблема была на стороне базы данных, этого достаточно. Но это также может быть проблемой подключения клиента.
Спидон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.