Подтвердить что ты не робот

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

Я использую персонаж Emoji в своем проекте. Эти символы сохраняются (?) В базе данных mysql. Я использовал базу данных по умолчанию в utf8mb4_general_ci. Он показывает

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

4b9b3361

Ответ 1

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');

Ответ 2

шаг 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;

Ответ 3

Если вы используете 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;
}

Ответ 4

Мой ответ только добавляет к 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 не имели никакого эффекта, даже если не было выдано никаких ошибок.

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

Ответ 5

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

Ответ 6

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

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) 

Ответ 7

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

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

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

mysql://USERNAME:[email protected]:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

Ответ 8

И базы данных, и таблицы должны иметь набор символов 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 в переполнении стека.

Ответ 9

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

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