Trpíte „dvojitým kódováním“.
Zde je to, co se stalo.
- Klient měl znaky zakódované jako utf8; a
SET NAMES latin1
lhal tvrzením, že klient měl kódování latin1; a- Sloupec v tabulce deklaroval
CHARACTER SET utf8
.
Pojďme si projít, co se stane s e-acute:é
.
- Šestnáctková hodnota v utf8 je 2 bajty:
C3A9
. SET NAMES latin1
viděl to jako 2 znaky zakódované v latinceÃ
a©
(hexadecimálně:C3
aA9
)- Protože cílem bylo
CHARACTER SET utf8
, tyto 2 znaky bylo potřeba převést.Ã
byl převeden na utf8 (hexC383
) a©
(hexadecimálníC2A9
) - Byly tedy uloženy 4 bajty (hexadecimální
C383C2A9
)
Při zpětném čtení byly provedeny opačné kroky a koncový uživatel si možná nevšiml ničeho špatného. Co je špatně:
- Uložená data jsou 2x větší, než by měla být (3x u asijských jazyků).
- Porovnání pro stejné, větší než atd. nemusí fungovat podle očekávání.
ORDER BY
nemusí fungovat podle očekávání.
Něco takového opraví vaše data:
UPDATE ... SET col = CONVERT(BINARY(CONVERT(
CONVERT(UNHEX(col) USING utf8)
USING latin1)) USING utf8);
Další diskuse aDalší příklady oprav