Gudžarátština začíná રેલવે
, správně? A Malyalam začíná നേപ
, správně? A angličtina by měla obsahovat Bureau’s
.
Toto je klasický případ
- Bajty, které máte v klientovi, jsou správně zakódovány v utf8. (
Bureau
je zakódován v podmnožině Ascii/latin1 utf8; ale’
není apostrof ascii.) - Připojili jste se k
SET NAMES latin1
(neboset_charset('latin1')
nebo ...), pravděpodobně ve výchozím nastavení. (Mělo to býtutf8
.) - Sloupec v tabulce byl deklarován jako
CHARACTER SET latin1
. (Nebo to možná bylo zděděno z tabulky/databáze.) (Mělo to býtutf8
.)
Oprava dat je "2-step ALTER".
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
kde jsou délky dostatečně velké a ostatní "..." mají cokoliv jiného (NOT NULL
, atd.) byl již ve sloupci.
Bohužel, pokud máte hodně sloupců, se kterými můžete pracovat, bude to vyžadovat hodně ALTERů. Můžete (měli byste) MODIFY
všechny potřebné sloupce do VARBINARY
pro jednu tabulku ve dvojici ALTERs
.
Oprava kódu je navázat utf8 jako spojení; to závisí na API používaném v PHP. ALTERs
změní definici sloupce.
Upravit
Máte VARCHAR
se špatnou CHARACTER SET
. Mojibake tedy vidíte jako રેલ
. Většina konverzních technik se snaží zachovat રેલ
, ale to není to, co potřebujete. Místo toho udělejte krok k VARBINARY
zachovává bity a ignoruje starou definici bitů reprezentujících znaky kódované latinkou. Druhý krok opět zachovává bity, ale nyní tvrdí, že představují znaky utf8.