Несколько мыслей:
Похоже, у вас правильно настроен набор символов.Тот факт, что HeidiSQL отображает другой набор символов, возможно, связан с тем, что клиенты сами устанавливают набор символов.
Например, ваш сервер mysql может использовать «Набор символов A» по умолчанию.Если клиент подключается и говорит, что хочет «Набор символов B», сервер преобразует его на лету.
utf8mb4
- это расширенный набор символов (и превосходит) utf8
.По умолчанию ваш сервер должен иметь значение utf8mb4
.Популярный вариант использования utf8mb4
- эмодзи.
В любом случае, причина, по которой вы получаете mojibake , вероятно, не связана с правильной настройкой этих наборов символов.
Что я думаюмогло произойти следующее (это предположение).
- Ваши таблицы / столбцы были установлены как UTF-8.
- Клиент подключается и сообщает серверу "Я хочувместо этого используйте ISO-8559-1 / latin ".
- Сервер с радостью соблюдает и преобразует строки ISO-8559-1 клиентов в UTF-8 на лету.
- Несмотря на желание клиентачтобы использовать ISO-8559-1, он на самом деле отправляет UTF-8.
- Сервер считает, что данные ISO-8559-1 и обрабатывает их как таковые, и преобразует UTF-8используя ISO-8559-1 для UTF.По сути, это двойное кодирование.
Если я прав, это означает, что вы можете установить для всех ваших столбцов, соединений и таблиц UTF-8, но ваши данные просто плохие.
Если это правильно, этот процесс является обратимым
Вам просто нужна противоположная операция.Например, если бы у вас была строка PHP $data
, которая «дважды кодируется» как UTF-8, процесс будет просто вызывать это:
$output = utf8_decode($input)
Это также можно исправить вMySQL.См. Этот вопрос переполнения стека.
Несколько вещей, о которых следует знать:
- Убедитесь, что это действительно так.Получаете ли вы правильный вывод после этой операции?
- Совершайте резервные копии, очевидно.
- Также убедитесь, что все, что записывало UTF-8 с двойным кодированием в вашу базу данных, теперь исправлено.Последнее, что вам нужно, это таблица, представляющая собой смесь разных кодировок.
Sidenote: Эта проблема встречается крайне часто.Вам несколько повезло, что вы француз, потому что это выдвигает на первый план проблему.У многих английских систем, которые я видел, есть эта проблема, но она в основном остается незамеченной долгое время, потому что большая часть текста не выходит за пределы общего диапазона ASCII.