sql >> Databasteknik >  >> RDS >> Mysql

Uppdaterar data i MySQL-databasen efter att ha infogat fel kodning

Du lider av "dubbelkodning".

Här är vad som hände.

  • Klienten hade tecken kodade som utf8; och
  • SET NAMES latin1 ljög genom att hävda att klienten hade latin1-kodning; och
  • Kolumnen i tabellen deklarerade CHARACTER SET utf8 .

Låt oss gå igenom vad som händer med e-acute:é .

  1. Hexan för det, i utf8 är 2 byte:C3A9 .
  2. SET NAMES latin1 såg det som 2 latin1-kodade tecken à och © (hex:C3 och A9 )
  3. Eftersom målet var CHARACTER SET utf8 , de två tecknen behövde konverteras.Ã konverterades till utf8 (hex C383 ) och © (hex C2A9 )
  4. Så, 4 byte lagrades (hex C383C2A9 )

När du läste den igen utfördes de omvända stegen, och slutanvändaren märkte möjligen inget fel. Vad är fel:

  • Datan som lagras är 2 gånger så stor som den borde vara (3x för asiatiska språk).
  • Jämförelser för lika, större än osv kanske inte fungerar som förväntat.
  • ORDER BY kanske inte fungerar som förväntat.

Något sådant här kommer att reparera dina data:

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

Mer diskussion ochFler exempel på att åtgärda det




  1. Android Realm som hanterar primärnyckel i relationsobjekt

  2. Meddela användaren om databasändring? JavaScript/AJAX

  3. PHP PDO::lastInsertId() returnerar 0

  4. Produktrecension – Stellar Repair för MySQL