Получить правильное кодирование действительно сложно - слишком много слоев:
- Браузер
- Страница
- PHP
- MySQL
Команда SQL «SET CHARSET utf8» из PHP гарантирует, что клиентская сторона (PHP) получит данные в utf8, независимо от того, как они хранятся в базе данных. Конечно, их сначала нужно правильно хранить.
Определение DDL и реальные данные
Кодировка, определенная для таблицы / столбца, на самом деле не означает, что данные находятся в этой кодировке. Если у вас есть таблица, определенная как, utf8
но сохраненная как другая кодировка, MySQL будет рассматривать ее какutf8
и у вас проблемы. Это означает, что вы должны сначала это исправить.
Что проверить
Вам нужно проверить, в какой кодировке поток данных на каждом уровне.
- Проверьте заголовки HTTP, заголовки.
- Проверьте, что действительно отправлено в теле запроса.
- Не забывайте, что MySQL имеет кодировку почти везде:
- База данных
- Столы
- Колонны
- Сервер в целом
- Клиент
Убедитесь, что везде найдется нужный.
Преобразование
Если вы получаете данные, например windows-1250
, и хотите их сохранить utf-8
, используйте этот SQL перед сохранением:
SET NAMES 'cp1250';
Если у вас есть данные в БД как windows-1250
и вы хотите их восстановить utf8
, используйте:
SET CHARSET 'utf8';
Еще несколько заметок:
- Не полагайтесь на слишком «умные» инструменты для отображения данных. Например, phpMyAdmin действительно плохо кодирует (делал, когда я его использовал). И он проходит через все слои, так что его трудно обнаружить.
- Кроме того, Internet Explorer по-настоящему глупо «угадывал» кодировку на основе странных правил.
- Используйте простые редакторы, в которых можно переключать кодировку. Я рекомендую MySQL Workbench.