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 latin1lhal 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 latin1viděl to jako 2 znaky zakódované v latinceÃa©(hexadecimálně:C3aA9)- 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 BYnemusí 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