Как сохранить Emoji Character в базе данных MySQL


173

Я использую персонаж Emoji в своем проекте. Эти символы сохраняются (??) в базе данных MySQL. Я использовал базу данных Default collation в utf8mb4_general_ci. Это шоу

1366 Неверное строковое значение: '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...' для столбца 'comment' в строке 1


1
Как вы сохраняете свои данные? Можете ли вы показать нам этот код?
Томас Бутелер

1
Спасибо за ваш комментарий. Я нашел решение для этой коллекции по умолчанию для базы данных изменений как ** utf8mb4 **, а также для коллекции таблиц изменений как ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Selvamani P

1
Код: insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'Установите utf8mb4 в соединение с базой данных: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Ответы:


31

шаг 1, измените кодировку вашей базы данных по умолчанию:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

шаг 2, установите кодировку при создании таблицы:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

или изменить таблицу

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;

Я последовал этим запросам и остановил и перезапустил сервер MySQL, но когда я пытаюсь вставить Emojis в мою таблицу, я все еще получаю ту же ошибку. Все команды прошли успешно, кроме INSERT. INSERT INTO Записи (дата, время, подпись) VALUES (2018-05-20 ', '12: 38: 00', 'Тестирование описания с помощью emoji: 😊❤️'); Параметры столбца: Сортировка: utf8mb4_0900_ai_ci Определение: текст описания

1
Ваше соединение также должно быть utf8mb4, а не utf8, чтобы оно работало.
Хенрик Хансен,

3
@ospider, на шаге 2 вы используете utfmb4_general_ci вместо unicode - какая причина почему?
Уоррен

265

1) База данных: Изменить параметры сортировки базы данных по умолчанию utf8mb4.

2) Таблица: изменить сопоставление таблицы как CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

Запрос:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) Код:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4) Установите utf8mb4в базе данных соединение:

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

4
Возможно ли это без изменения базы данных по умолчанию?
AliN11

23
Это не работает для меня. Я получаю "???" вместо смайликов. только "☺" этот смайлик благополучно добрался до базы данных.
Любопытный разработчик

10
Возможно, потребуется обновить не только таблицу до utf8mb4, но и сами столбцы, в противном случае они все равно могут отображаться как ?? вместо 💙.
Ael

2
Работал для меня, но не забудьте перезапустить MySQL.
Рави

8
Мне нужно бежать, SET NAMES utf8mb4;чтобы начать сохранять смайлики; перед этой командой он ??
сохранял

18

И базы данных, и таблицы должны иметь набор символов utf8mb4и параметры сортировки utf8mb4_unicode_ci.

При создании новой базы данных вы должны использовать:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Если у вас есть база данных, и вы хотите добавить поддержку:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Вам также необходимо установить правильный набор символов и параметры сортировки для ваших таблиц:

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

или измените его, если у вас есть существующие таблицы с большим количеством данных:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Обратите внимание, что utf8_general_ciбольше не рекомендуется передовая практика. Смотрите соответствующие вопросы и ответы:

В чем разница между utf8_general_ci и utf8_unicode_ci в переполнении стека.


У меня есть база данных и таблица, содержащая data.and при выполнении второго оператора alter, говорит, что: ОШИБКА 1833 (HY000): Невозможно изменить столбец 'id': используется в ограничении внешнего ключа 'FK12njtf8e0jmyb45lqfpt6ad89' таблицы 'lizbazi.post'
Seyyed Махдияр Зерепуш

@SeyyedMahdiyarZerehpoush - вы можете обойтись без ограничения вашего обновления определенными столбцами, которые требуют его, как описано здесь: stackoverflow.com/a/15781925/1247581 НапримерALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

любая разница при использовании utf8mb4_binпротив utf8mb4_unicode_ciстолбцов?
Мухаммед Омер Аслам

14

Если вы используете Solr + Mysql + Java, вы можете использовать:

Это может быть использовано:

  • case1: когда вы не хотите изменять DB.
  • case2: когда вам нужно импортировать смайлики из вашего Mysql в ядро ​​Solr.

В приведенном выше случае это одно из решений для хранения ваших смайликов в вашей системе.

Шаги, чтобы использовать это:

Используемая библиотека: import java.net.URLDecoder; импорт java.net.URLEncoder;

  1. Используйте urlEncoder для кодирования вашей строки, имеющей смайлики.
  2. Сохраните его в БД, не изменяя MysqlDB.
  3. Вы можете сохранить его в ядре Solr (декодированная форма), если хотите, или вы можете хранить закодированную форму.
  4. При извлечении этих смайликов из ядра DB или Solr теперь вы можете декодировать их с помощью urlDecoder.

Пример кода:

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}

Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
Тоби Спейт

1
работать как шарм, я использовал его в модели, поэтому мне действительно не нужно менять какой-либо код и базу данных, только модель данных в установщике и получателе контента
bowpunya

1
Вызовы кодирования / декодирования имеют тенденцию вызывать проблемы. Вместо этого исправьте настройки кодировки в разных местах.
Рик Джеймс

1
Это не решение проблемы, это обход ее. И вы столкнетесь с множеством проблем, связанных с этим методом, например, вы замедлите свое приложение, потому что вам нужно все декодировать и кодировать. Также, если вы введете символ %, ваше декодирование будет нарушено.
Джонатан Лалиберте

14

Я обновил свою базу данных и таблицу до обновленного с utf8 до utf8mb4 . Но у меня ничего не работает. Затем я попытался обновить тип данных столбца до blob , к счастью, он сработал и данные были сохранены. Даже моя база данных и таблица - CHARACTER SET utf8 COLLATE utf8_unicode


13

Команда для изменения столбца:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

И нам нужно использовать тип = BLOB

Пример для изменения приведен ниже:

ALTER TABLE messages MODIFY content BLOB;

Я проверил, что последние MySQL и другие базы данных не нужно ''использовать в команде для table_name, column_name и т.д.

Извлекать и сохранять данные: напрямую сохранять содержимое чата в столбец и извлекать данные, извлекать данные в виде байтового массива (byte[])из столбца db, а затем преобразовывать их, stringнапример, в (код Java)

new String((byte[]) arr) 

2
Да. Если вам просто нужно хранить юникод, такой как смайлики, в определенном поле, принятый ответ слишком навязчив, просто измените поле text/ varcharна a, blobи все готово. Безумие, чтобы преобразовать кодировку и сопоставление на всей БД только для этого :)
davidkonrad

9

Мой ответ только добавляет к Selvamani P ответ.

Вам также может понадобиться изменить любые SET NAMES utf8запросы с помощью SET NAMES utf8mb4. Это помогло мне.

Кроме того, это отличная статья для переноса вашего сайта с utf8 на utf8mb4. В частности, статья делает 2 хороших замечания об индексах и исправлении таблиц после преобразования их в utf8mb4:

ИНДЕКСЫ

При преобразовании из utf8 в utf8mb4 максимальная длина столбца или ключа индекса не изменяется в байтах. Следовательно, он меньше с точки зрения символов, поскольку максимальная длина символа теперь составляет четыре байта вместо трех. [...] Механизм хранения InnoDB имеет максимальную длину индекса 767 байт, поэтому для столбцов utf8 или utf8mb4 можно индексировать максимум 255 или 191 символов соответственно. Если в настоящее время у вас есть столбцы utf8 с индексами длиннее 191 символа, вам нужно будет индексировать меньшее количество символов при использовании utf8mb4.

РЕМОНТНЫЕ СТОЛЫ

После обновления сервера MySQL и внесения необходимых изменений, описанных выше, обязательно восстановите и оптимизируйте все базы данных и таблицы. Я не сделал это сразу после обновления (я не думал, что это было необходимо, поскольку на первый взгляд все работало нормально), и столкнулся с некоторыми странными ошибками, когда операторы UPDATE не имели никакого эффекта, даже если нет ошибки были выброшены.

Подробнее о запросах на восстановление таблиц читайте в статье.


REPAIR TABLEи OPTIMIZE TABLEдолжно быть ненужным - это ALTERдает эффект их выполнения.
Рик Джеймс

5

Главное не было упомянуто в ответах выше, что

Нам нужно передать строку запроса с параметрами "useUnicode=yes"и "characterEncoding=UTF-8"в строке подключения

Что-то вроде этого

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

5

Ну, вам не нужно менять всю БД Charset. Вместо этого вы можете сделать это, изменив столбец на тип blob .

Сообщения ALTER TABLE ИЗМЕНИТЬ содержимое BLOB;


3

У меня есть хорошее решение, чтобы сэкономить ваше время. Я также сталкиваюсь с той же проблемой, но не смог решить эту проблему первым ответом.

Ваш персонаж по умолчанию - utf-8. Но для поддержки Emoji необходим utf8mb4. Если у вас есть разрешение на пересмотр файла конфигурации mysql, вы можете выполнить этот шаг.

Поэтому выполните этот следующий шаг, чтобы обновить свой набор символов (с utf-8 до utf8mb4).

шаг 1. откройте my.cnf для mysql, добавьте следующие строки в my.cnf.

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

шаг 2. остановите службу MySQL и запустите службу MySQL

mysql.server stop
mysql.server start

Законченный! Затем вы можете проверить, что ваш персонаж изменен на utf8mb4.

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

2

Поддержка Emoji для приложений, имеющих технический стек - mysql, java, springboot, hibernate

Примените ниже изменения в MySQL для поддержки Unicode.

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Соединение с БД - изменение URL JDBC:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

Примечание. Если вышеуказанный шаг не работает, обновите версию MySQL-коннектора до 8.0.15. (mysql 5.7 работает с версией соединителя 8.0.15 для поддержки юникода)


1

Самое простое решение, которое работает для меня, - это хранить данные как json_encode .

позже, когда вы получите, просто убедитесь, что вы json_decode его.

Здесь вам не нужно менять параметры сортировки или кодировки базы данных и таблицы.


0

Для тех , кто пытается решить эту проблему на экземпляре управляемой MySQL (в моем случае на AWS RDS), самый простой способ был изменить группу параметров и установить набор символов сервера и сортировки , чтобы быть utf8mb4и utf8mb4_bin, соответственно. После перезагрузки сервера быстрый запрос проверяет настройки системных баз данных и всех вновь созданных:

SELECT * FROM information_schema.SCHEMATA S;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.