sql >> Database >  >> RDS >> Mysql

Gegevens bijwerken in MySQL-database na invoegen in de verkeerde codering

Je hebt last van "dubbele codering".

Dit is wat er is gebeurd.

  • De client had tekens gecodeerd als utf8; en
  • SET NAMES latin1 loog door te beweren dat de client latin1-codering had; en
  • De kolom in de tabel verklaarde CHARACTER SET utf8 .

Laten we eens kijken wat er met e-acute gebeurt:é .

  1. De hex daarvoor, in utf8 is 2 bytes:C3A9 .
  2. SET NAMES latin1 zag het als 2 latin1-gecodeerde tekens à en © (hex:C3 en A9 )
  3. Sinds het doel CHARACTER SET utf8 . was , die 2 tekens moesten worden geconverteerd.Ã is geconverteerd naar utf8 (hex C383 ) en © (hex C2A9 )
  4. Er zijn dus 4 bytes opgeslagen (hex C383C2A9 )

Bij het terug uitlezen zijn de stappen in omgekeerde volgorde uitgevoerd en heeft de eindgebruiker mogelijk niets verkeerds opgemerkt. Wat is er mis:

  • De opgeslagen gegevens zijn 2 keer zo groot als ze zouden moeten zijn (3x voor Aziatische talen).
  • Vergelijkingen voor gelijk, groter dan, enz. werken mogelijk niet zoals verwacht.
  • ORDER BY werkt mogelijk niet zoals verwacht.

Zoiets zal je gegevens herstellen:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin1)) USING utf8);

Meer discussie enMeer voorbeelden om het te repareren




  1. BOB lastInsertId werkt niet op transacties?

  2. Som rijen van verschillende voorwaarden in Mysql

  3. Een schemagebonden weergave maken in SQL Server

  4. Hoe verwijder ik nieuwe regeltekens uit gegevensrijen in mysql?