Як я можу вставити смайлики в 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.