Отримати правильне кодування дійсно складно - занадто багато шарів:
- Веб-переглядач
- Сторінка
- 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.