Правильно понять кодировку - слишком много слоев:
Команда 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.