Je třeba zvážit 3 různé případy:
Hodnoty jsou skutečně zakódovány pomocí Latin1
Toto je konzistentní případ:deklarovaná shoda znakové sady a kódování obsahu. Toto byl jediný případ, kterým jsem se zabýval ve své první odpovědi.
Použijte příkaz, který jste navrhli:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Všimněte si, že CONVERT TO CHARACTER SET
příkaz se objevil pouze v MySQL 4.1.2, takže každý, kdo používá databázi nainstalovanou před rokem 2005, musel použít trik pro export/import. To je důvod, proč je na internetu tolik starších skriptů a dokumentů, které to dělají starým způsobem.
Hodnoty jsou již zakódovány pomocí utf8
V tomto případě nechcete, aby mysql převáděl žádná data, stačí změnit metadata sloupce.
Chcete-li to provést, musíte nejprve změnit typ na BLOB a poté na TEXT utf8 pro každý sloupec, aby nedocházelo k převodům hodnot:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Toto je doporučený způsob a je výslovně zdokumentován v Alter Dokumentace syntaxe tabulky .
Hodnoty používané v jiném kódování
Výchozí kódování bylo Latin1 několik let na některých distribucích Linuxu. V tomto případě musíte použít kombinaci dvou technik:
- Opravte metadata tabulky pomocí triku typu BLOB
- Převeďte hodnoty pomocí
CONVERT TO
.