База MySQL, таблица с юзерами, кодировка
utf8Юзер обновляет имя:
UPDATE users SET name = 'Аня 🌸' WHERE id = 42;
И вместо успеха прилетает:
Incorrect string value: '\xF0\x9F\x8C\xB8' for column 'name'
Обычные буквы и цифры сохранялись годами, а тут запрос падает на ровном месте
Вопрос: почему невинный цветочек ломает вставку?
Потому что кодировка
utf8 в MySQL - это не полноценный UTF-8Историческая засада: их
utf8 умеет хранить максимум 3 байта на символА эмодзи (и часть редких иероглифов, старые символы) - это 4 байта
Символ не влезает в отведённое место, база отказывается его писать и кидает ошибку
То есть колонка принимает буквы, кириллицу, латиницу - всё, что укладывается в 3 байта
А как только прилетает 4-байтовый символ, всё ломается
И ловится это не сразу: на тесте с обычными именами чисто, а в проде первый же юзер с эмодзи в нике роняет запрос
🛠 Как чинить
Нужна кодировка
utf8mb4 - вот она и есть настоящий полный UTF-8 с поддержкой 4 байт:ALTER TABLE users
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
И проверь, что на
utf8mb4 переведены все три уровня: сама база, таблицы и подключение приложения к базеЕсли приложение коннектится в старой
utf8, эмодзи всё равно потеряются по дороге, даже когда таблица уже правильнаяВ MySQL
utf8 - это минаВсегда бери
utf8mb4 с самого начала, тогда эмодзи, редкие языки и всякая экзотика не будут ронять тебе вставкиВ Postgres, к слову, такой засады нет - там
UTF8 сразу полныйЛовили это? Эмодзи в имени, в сообщении, в названии - что вам роняло базу? 🤔
#mysql #database #backend #dev #programming #bugs