История базы данных MYSQL и выражения Emoji

база данных

фон проблемы

Многочисленные методы ввода и клавиатуры на мобильных телефонах поддерживают ввод выражений смайликов, вызывая все больше и больше помех для ранее разработанных программ.

  1. Популярность мобильных покупок, в 2018 году, мобильные онлайн-транзакции «Double Eleven» достигли 93,6%.
  2. Уже в 2017 году статистика, опубликованная QQ, превысила 30,3 миллиарда в годовом отчете WeChat.

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

Под решением этой задачи мы в основном понимаем следующие три аспекта:

  1. Концепции кодирования MySQL
  2. Откуда взялся «искаженный код» Mysql: преобразование кодировки символов
  3. Проблемы с использованием эмодзи в Mysql

анализ проблемы

Вчера я неожиданно получил деловую обратную связь, и была выдана сигнализация мониторинга.Некоторые заказы зависли, и они не были отправлены в нисходящий поток в определенной системе, что в конечном итоге привело к пропуску времени доставки.

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

Развернув подробный журнал, нашел ключевой журнал:

ОШИБКА 1366: неверное строковое значение: "\xF0\x9F\x99\x8F..." для столбца "Примечание" в строке 2.

Попытка записать 4-байтовый символ в 3-байтовый столбец Remark, естественно, выдает ошибку.

Затем мы посмотрели на замечание пользователя. Информация о замечании: ** Утром никого нет дома, пожалуйста, пришлите днем, спасибо😊

Спасибо за это действительно не легкое, старое железо. Нет проблем с размещением заказа с эмодзи. Администратор базы данных провел поиск в базе данных исторических заказов, и она поддерживается. Я искал службу заданий, которая сообщила об ошибке, и обнаружил, что операционная библиотека была недавно перенесена с SQL Server на mysql, и при извлечении и печати информации о счете произошла ошибка.

проблема вызывает

Связанные персонажи и очки знаний по кодированию

Существует несколько методов кодирования набора символов Unicode, например, распространенные utf-8, utf-16, utf-32 и т. д.utf-8 - это кодировка переменной длины, использует 1-4 байта для представления символов, utf-16 использует фиксированные 2 байта, а utf-32 использует 4 байта для хранения.

В C# Encoding.Unicode реализован как 2-байтовый Little-Endian UTF-16, а если это 4 байта, используется UTF-32.

Unicode определяет кодовые точки и значения эмодзи на второй панели (Plane 1, SMP). Каждая эмоция использует 4 байта.Так называемый Emoji — это символ, расположенный в разделе u1F601-\u1F64F Unicode.

В таблицах базы данных SQL Server строки типа nvarchar по умолчанию являются строками Юникода переменной длины.

MySQL версии 5.5.3 и ниже набор символов utf8 utf8 может представлять до 3 байтов, 5.5.3 и выше поддерживает 4-байтовый кодированный набор символов utf8 utf8mb4, набор символов MySQL версии 8.0 по умолчанию — utf8mb4.

MYSQL по умолчанию хранит символы utf8 в кодировке с обратным порядком байтов без спецификации.

Процесс преобразования набора символов в MySQL

字符集转换
Картинка взята из интернета

Понимая правила преобразования кодировки символов, мы можем понять, почему возникают искаженные символы и сбои вставки символов.

https://www.ibm.com/developerworks/cn/java/analysis-and-summary-of-common-random-code-problems/index.html

решение

1. Разберитесь с текущими настройками кодировки символов

Давайте сначала посмотрим на соответствующие результаты конфигурации системы:

mysql> show variables like '%char%';
+--------------------------+----------------------------------------------+
| Variable_name            | Value                                        |
+--------------------------+----------------------------------------------+
| character_set_client     | utf8                                         |
| character_set_connection | utf8                                         |
| character_set_database   | utf8mb4                                      |
| character_set_filesystem | binary                                       |
| character_set_results    | utf8                                         |
| character_set_server     | utf8mb4                                      |
| character_set_system     | utf8                                         |
| character_sets_dir       | D:\mysql\mysql-8.0.11-winx64\share\charsets\ |
+--------------------------+-------------------------------------   ---------+
8 rows in set

2. Явно указать набор символов при проектировании базы данных

Три уровня библиотеки, таблицы и поля должны быть четкими, иначе будет использоваться дефолтная конфигурация my.ini по принципу от низкого к высокому. Конкретное заявление о создании не является подробным, пожалуйста, выполните поиск самостоятельно.

3. Единый набор символов

Цель состоит в том, чтобы уменьшить количество ненужных конверсий, если это не требуется специально. Особое внимание следует уделить тому, чтобы преобразования не приводили к необратимым преобразованиям из-за несовместимости набора символов. Например, некоторые символы Unicode недоступны в Utf8, как и некоторые кодировки gbk. Конкретно:

Клиент, набор символов-клиент и набор символов таблицы полностью соответствуют трем наборам символов, чтобы гарантировать отсутствие искаженных символов.

На пустые строки в операторах SQL может влиять набор символов character_set_connection или настройки вводного кода, а такие операции, как сравнения, могут давать совершенно разные результаты, будьте осторожны! Решение состоит в том, чтобы выполнить следующую строку перед отправкой запроса: SET NAMES '***'

Эквивалентно следующим трем командам:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

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

С помощью ALTER TABLE ... CHARSET=xxx или ALTER TABLE ... CONVERT TO CHARACTER SET ... можно полностью уничтожить данные.О возможных практиках см. в блоге Lu Junyi (см. Цитата 5).

написать на обороте

Что касается выражений эмодзи, с поддержкой ввода с мобильного телефона и любовью молодых людей, вы должны подумать над следующими вопросами, если хотите избежать проблем:

  1. Функциональный дизайн дает понять, должно ли поле ввода поддерживать выражения эмодзи.
  2. Восходящие и нисходящие ссылки договариваются о том, как хранить и отображать, а также о перехвате строк.
  3. Проблемы, связанные с эксплуатацией, обслуживанием и обновлением набора символов базы данных, должны быть осторожны, чтобы предотвратить потерю данных.
  4. Синхронизация ведущий-ведомый, обратите внимание, что набор символов utf8mb4, не поддерживаемый более ранней версией, приведет к сбою синхронизации.

источник

  1. Интерпретация отчета НИИ перспективной промышленности:Упрощение мобильных платежей 10 диаграмм, чтобы понять женщину, стоящую за глобальным шоппингом 2018 года
  2. Вступительная статья Руан Ифэн:Знакомство с эмодзи
  3. 36 Криптон Интересная статья:Волна за волной смайликов выходит, как ваша клавиатура с эмодзи?
  4. Интересные зарубежные данные:Языковая революция, в которой вы участвуете | Emoji: Восстановление Вавилонской башни
  5. Лу Цзюньи: Научитесь понимать и решать проблему искажения MySQL за 10 минут:Научитесь понимать и решать проблемы с искажениями MySQL за 10 минут
  6. MYSQL Help About Unicode:charset-unicode
  7. Анализ и сводка распространенных проблем с искажениями:Искаженный анализ

Эта статья одновременно публикуется в публичном аккаунте:MYSQL искажает сортировку проблем