Следует рассмотреть 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
Это рекомендуемый способ, и он явно задокументирован в Alter Table. Синтаксическая документация.
Значения используют в другой кодировке
В течение нескольких лет в некоторых дистрибутивах Linux кодировкой по умолчанию была Latin1. В этом случае вы должны использовать комбинацию двух методов:
- Исправьте метаданные таблицы, используя трюк с типом BLOB.
- Преобразуйте значения, используя
CONVERT TO
.
person
Jerome
schedule
31.05.2011