sql >> Databáze >  >> RDS >> Mysql

Aktualizace dat v databázi MySQL po vložení nesprávného kódování

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:é .

  1. Šestnáctková hodnota v utf8 je 2 bajty:C3A9 .
  2. SET NAMES latin1 viděl to jako 2 znaky zakódované v latince à a © (hexadecimálně:C3 a A9 )
  3. Protože cílem bylo CHARACTER SET utf8 , tyto 2 znaky bylo potřeba převést.Ã byl převeden na utf8 (hex C383 ) a © (hexadecimální C2A9 )
  4. 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




  1. Problémy se znakovou sadou připojení k MySQL

  2. Mohu spustit trigger na příkazu select v mysql?

  3. Vytvoření tabulky a vložení stejným postupem v pl/sql

  4. doba provádění mysql