фон проблемы
Многочисленные методы ввода и клавиатуры на мобильных телефонах поддерживают ввод выражений смайликов, вызывая все больше и больше помех для ранее разработанных программ.
- Популярность мобильных покупок, в 2018 году, мобильные онлайн-транзакции «Double Eleven» достигли 93,6%.
- Уже в 2017 году статистика, опубликованная QQ, превысила 30,3 миллиарда в годовом отчете WeChat.
Недавно наша команда столкнулась с онлайн-проблемой, которая была вызвана использованием эмодзи в примечаниях к заказу пользователя.
Под решением этой задачи мы в основном понимаем следующие три аспекта:
- Концепции кодирования MySQL
- Откуда взялся «искаженный код» Mysql: преобразование кодировки символов
- Проблемы с использованием эмодзи в 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
Понимая правила преобразования кодировки символов, мы можем понять, почему возникают искаженные символы и сбои вставки символов.
решение
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).
написать на обороте
Что касается выражений эмодзи, с поддержкой ввода с мобильного телефона и любовью молодых людей, вы должны подумать над следующими вопросами, если хотите избежать проблем:
- Функциональный дизайн дает понять, должно ли поле ввода поддерживать выражения эмодзи.
- Восходящие и нисходящие ссылки договариваются о том, как хранить и отображать, а также о перехвате строк.
- Проблемы, связанные с эксплуатацией, обслуживанием и обновлением набора символов базы данных, должны быть осторожны, чтобы предотвратить потерю данных.
- Синхронизация ведущий-ведомый, обратите внимание, что набор символов utf8mb4, не поддерживаемый более ранней версией, приведет к сбою синхронизации.
источник
- Интерпретация отчета НИИ перспективной промышленности:Упрощение мобильных платежей 10 диаграмм, чтобы понять женщину, стоящую за глобальным шоппингом 2018 года
- Вступительная статья Руан Ифэн:Знакомство с эмодзи
- 36 Криптон Интересная статья:Волна за волной смайликов выходит, как ваша клавиатура с эмодзи?
- Интересные зарубежные данные:Языковая революция, в которой вы участвуете | Emoji: Восстановление Вавилонской башни
- Лу Цзюньи: Научитесь понимать и решать проблему искажения MySQL за 10 минут:Научитесь понимать и решать проблемы с искажениями MySQL за 10 минут
- MYSQL Help About Unicode:charset-unicode
- Анализ и сводка распространенных проблем с искажениями:Искаженный анализ
Эта статья одновременно публикуется в публичном аккаунте:MYSQL искажает сортировку проблем