Як зберігати персонаж Emoji в базі даних MySQL


172

Я використовую персонаж Emoji у своєму проекті. Ці символи зберігаються (??) у mysql базі даних. Я використовував базу даних зіставлення за замовчуванням у utf8mb4_general_ci. Це показують

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


1
Як ви зберігаєте свої дані? Чи можете ви показати нам цей код?
— Томаш Бутелер

1
Дякуємо за ваш коментар Я знайшов рішення для цієї колекції за замовчуванням Змінити базу даних, як ** utf8mb4 **, а також змінити колекцію таблиці як ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
— Сельвамані 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

Відповіді:


29

крок 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, але коли я намагаюся вставити емоджи у свою таблицю, я все одно отримую ту саму помилку. Усі команди пройшли успішно, крім INSERT. ВСТАВИТИ Записи (дата, час, підпис) ЦІННОСТІ (2018-05-20 ', '12: 38: 00', 'Опис тестування з емоджими: 😊❤️'); Налаштування стовпця: Збір: utf8mb4_0900_ai_ci Визначення: текст опису

1
Для того, щоб він працював, ваше з'єднання також має бути utf8mb4, а не utf8.
— Генрік Хансен

3
@ospider, на кроці 2 ви використовуєте utfmb4_general_ci замість unicode - будь-яка причина, чому?
— Воррен

263

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, але ТАКОЖ самі колонки, інакше вони все ще можуть відображатися як ?? замість 💙.
— Аель

2
Працював для мене, але не забудьте перезапустити MySQL.
— Раві Місра

8
Мені потрібно бігти, SET NAMES utf8mb4;щоб почати зберігати смайлики; перед цією командою було врятувати їх як??
— cubbuk

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 у стеку Overflow.


У мене є бази даних і таблиці , що містить data.and при виконанні другого альтер заяву, каже , що: ERROR 1833 (HY000): Не вдається змінити стовпець «ID»: використовується в якості зовнішнього ключа обмеження «FK12njtf8e0jmyb45lqfpt6ad89» таблиці «lizbazi.post»
— Сейєд Mahdiyar Zerehpoush

@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_binvs utf8mb4_unicode_ciдля стовпців?
— Мухаммед Омер Аслам

14

Якщо ви використовуєте Solr + Mysql + Java, ви можете використовувати:

Це можна використовувати:

  • case1: Коли ви не хочете змінювати БД.
  • case2: коли вам доведеться імпортувати смайлики з вашого Mysql до ядра Solr.

У цьому випадку це одне з рішень для зберігання смайликів у вашій системі.

Етапи його використання:

Використовується бібліотека: import java.net.URLDecoder; імпортувати java.net.URLEкодер;

  1. Використовуйте urlEncoder для кодування String із смайликами.
  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;
}

Дякуємо за цей фрагмент коду, який може надати деяку обмежену та негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення, показавши, чому це хороше рішення проблеми, та зробило б кориснішим майбутнім читачам інші подібні питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
— Toby Speight

1
працює як шарм, я використовував його в моделі, тому мені дійсно не потрібно міняти будь-який код і базу даних, тільки модель даних на сеттер і
— гетьтер

1
Виклики кодування / декодування функції викликають проблеми. Замість цього фіксуйте налаштування шафи в різних місцях.
— Рік Джеймс

1
Це не вирішує проблему, це обходить її. І ви зіткнетеся з безліччю проблем із цим методом, наприклад, ви уповільнить свою програму, оскільки вам доведеться все розшифрувати та кодувати. Крім того, якщо ви введете символ %, ваше розшифровка порушиться.
— Джонатан Лаліберте

14

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


13

Команда для зміни стовпця:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

І нам потрібно використовувати type = BLOB

Приклад для зміни такий:

ALTER TABLE messages MODIFY content BLOB;

Я перевірив, що новітні бази даних mySQL та інших баз даних не потрібно ''використовувати в команді на ім'я table_name, column_name тощо.

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

new String((byte[]) arr) 

2
Так. Якщо вам просто потрібно зберігати unicode, як емоджи, у певному полі, прийнята відповідь є занадто нав'язливою, просто змініть text/ varcharполе на a, blobі ви закінчите. Божевілля конвертувати діаграми та зіставлення в цілому БД саме для цього :)
— davidkonrad

9

Моя відповідь лише додає відповідь Сельвамані Р.

Вам також може знадобитися змінити будь-які 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

Ну, вам не потрібно змінювати цілий набір БД. Замість цього ви можете зробити це, змінивши колонку на тип blob .

ПОЛІТИ ТАБЛИЧНІ повідомлення ЗМІНЕННЯ вмісту BLOB;


3

У мене є гарне рішення, щоб заощадити ваш час. Я також зустрічаюсь з тією ж проблемою, але не вдалося вирішити цю проблему першою відповіддю.

Ваш персонаж за замовчуванням - utf-8. Але емоджі потребує 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, сплячий режим

Застосовуйте нижче зміни в 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 для підтримки unicode)


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.