Конвертер кодировок текста

Кракозябры и вопросительные знаки в MySQL

Исправить текст в конвертере ↓

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

Три типичные картины

Что видноЧто произошлоМожно ли вернуть
????Русский текст записан в столбец или через соединение в кодировке без кириллицы (например, latin1). Буквы заменены вопросительными знаками при записи.Нет — нужно записать данные заново
ТеÑÑ‚ или ТестБайты UTF-8 прошли через соединение с кодировкой latin1 и были сохранены как отдельные символы — «двойное кодирование».Да, запросом ниже
Нормальный текст в phpMyAdmin, кракозябры на сайтеВ базе всё в порядке, ошибка в кодировке соединения скрипта или страницы.Данные не испорчены — исправляется настройка

Как настроить кодировку правильно

  • Таблицы и столбцы — utf8mb4: ALTER TABLE имя CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • Соединение — тоже utf8mb4. В PHP: mysqli_set_charset($link, "utf8mb4") или charset=utf8mb4 в строке подключения PDO. В консоли: SET NAMES utf8mb4;
  • Страница — <meta charset="utf-8"> или заголовок Content-Type: text/html; charset=utf-8.
  • Дамп — mysqldump --default-character-set=utf8mb4, иначе при переносе базы данные могут испортиться в пути.

utf8 или utf8mb4

Кодировка, которая в MySQL называется utf8, на самом деле хранит не больше трёх байтов на символ (её настоящее имя — utf8mb3). Русский текст в ней помещается, а эмодзи и некоторые редкие иероглифы — нет: при вставке появится ошибка «Incorrect string value» или текст будет обрезан. Полноценный UTF-8 в MySQL — это utf8mb4; используйте его для всех новых таблиц.

Как исправить двойное кодирование

Если данные выглядят как ТеÑÑ‚, их можно восстановить: «распаковать» символы обратно в байты через latin1 и прочитать эти байты как UTF-8. В MySQL кодировка latin1 соответствует Windows-1252.

UPDATE таблица SET поле = CONVERT(BINARY CONVERT(поле USING latin1) USING utf8mb4);

Перед этим обязательно сделайте резервную копию и проверьте запрос на нескольких строках через SELECT: если в столбце смешаны испорченные и нормальные записи, нормальные после такого запроса испортятся. Небольшой фрагмент текста проще проверить в конвертере ниже: вставьте его и нажмите «Определить кодировку текста».

Частые вопросы

В phpMyAdmin текст нормальный, а на сайте — кракозябры. Где ошибка?
В соединении сайта с базой. phpMyAdmin сам задаёт правильную кодировку соединения, а скрипт сайта — нет. Добавьте после подключения mysqli_set_charset($link, "utf8mb4") или укажите charset=utf8mb4 в настройках подключения вашего движка.
Нужно ли переводить старую базу из utf8 в utf8mb4?
Если на сайте могут появиться эмодзи или редкие символы — да. Перевод выполняется командой ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 и не портит русский текст, но индексы по длинным текстовым полям может понадобиться укоротить: в utf8mb4 символ занимает до четырёх байтов.