sql >> Database teknologi >  >> RDS >> Mysql

Opdatering af data i MySQL-database efter indsættelse i den forkerte kodning

Du lider af "dobbeltkodning".

Her er, hvad der skete.

  • Klienten havde tegn kodet som utf8; og
  • SET NAMES latin1 løj ved at hævde, at klienten havde latin1-kodning; og
  • Kolonnen i tabellen erklærede CHARACTER SET utf8 .

Lad os gennemgå, hvad der sker med e-acute:é .

  1. Hexet for det i utf8 er 2 bytes:C3A9 .
  2. SET NAMES latin1 så det som 2 latin1-kodede tegn à og © (hex:C3 og A9 )
  3. Da målet var CHARACTER SET utf8 , de 2 tegn skulle konverteres.Ã blev konverteret til utf8 (hex C383 ) og © (hex C2A9 )
  4. Så, 4 bytes blev gemt (hex C383C2A9 )

Når du læste det igen, blev de omvendte trin udført, og slutbrugeren bemærkede muligvis intet galt. Hvad er der galt:

  • De lagrede data er 2 gange så store, som de burde være (3x for asiatiske sprog).
  • Sammenligninger for lig, større end osv. fungerer muligvis ikke som forventet.
  • ORDER BY fungerer muligvis ikke som forventet.

Noget som dette vil reparere dine data:

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

Mere diskussion ogFlere eksempler på at rette det




  1. hvordan man genopbygger wf_java_deferred-køen

  2. Hvorfor er MySQL InnoDB så meget langsommere ved fuldbordsscanninger end MyISAM?

  3. Hvordan retter jeg fejlen 'Named Pipes Provider, fejl 40 - Kunne ikke åbne en forbindelse til' SQL Server'?

  4. AWS RDS:"SQLSTATE[22001] - Data for lange til kolonne" ved hjælp af MariaDB 10.2