Исправить текст в конвертере ↓
В 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, иначе при переносе базы данные могут испортиться в пути.Кодировка, которая в 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: если в столбце смешаны испорченные и нормальные записи, нормальные после такого запроса испортятся. Небольшой фрагмент текста проще проверить в конвертере ниже: вставьте его и нажмите «Определить кодировку текста».
mysqli_set_charset($link, "utf8mb4") или укажите charset=utf8mb4 в настройках подключения вашего движка.