Як зберігати персонаж 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.