Есть 3 разных случая для рассмотрения:
Значения действительно кодируются с использованием Latin1
Это последовательный случай: заявленная кодировка и совпадение кодировки контента. Это был единственный случай, который я рассмотрел в своем первоначальном ответе.
Используйте предложенную вами команду:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Обратите внимание, что команда CONVERT TO CHARACTER SET
появилась только в MySQL 4.1.2, поэтому любой, кто использовал базу данных, установленную до 2005 года, должен был использовать трюк экспорта / импорта. Вот почему в Интернете так много старых скриптов и документов, делающих это по-старому.
Значения уже закодированы с использованием utf8
В этом случае вы не хотите, чтобы mysql преобразовывал какие-либо данные, вам нужно только изменить метаданные столбца.
Для этого вам нужно сначала изменить тип на BLOB, а затем на TEXT utf8 для каждого столбца, чтобы не было преобразований значений:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Это рекомендуемый способ, и он явно задокументирован в Изменить синтаксическую документацию таблицы .
Значения используются в другой кодировке
Кодировка по умолчанию была Latin1 в течение нескольких лет в некоторых дистрибутивах Linux. В этом случае вы должны использовать комбинацию двух техник:
- Исправьте метаданные таблицы, используя трюк типа BLOB
- Преобразовать значения, используя
CONVERT TO
.