sql >> Databasteknik >  >> RDS >> Mysql

UTF-8-strängar i en MySQL-databas blev trassliga efter konfigurationsändring

C3 83 C6 92 C3 82 C2 AA
C3 3F C2 AA

Det är vad du får om du behandlar sekvensen av bytes som UTF-8 och sedan kodar den som ISO-8859-1. 3F är ? , som har inkluderats som ett ersättningstecken, eftersom UTF-8 C6 92 är U+0192 ƒ som inte finns i ISO-8859-1. Men det finns i Windows kodtabell 1252 västeuropeisk, en kodning mycket lik ISO-8859-1; där är det byte 0x83.

C3 83 C2 AA

Gå igenom ytterligare en omgång av behandla-som-UTF-8-bytes-and-encode-to-cp1252 och du får:

C3 AA

vilket slutligen är UTF-8 för ê .

Observera att även om du visar en HTML-sida som inte är XML uttryckligen som ISO-8859-1, kommer webbläsare faktiskt att använda cp1252-kodningen, på grund av otäcka historiska skäl.

Tyvärr har MySQL ingen cp1252-kodning; latin1 är (korrekt) ISO-8859-1. Så du kommer inte att kunna fixa data genom att dumpa som latin1 och sedan ladda om som utf8 (två gånger). Du måste bearbeta skriptet med en textredigerare som kan spara som antingen (eller t.ex. i Python file(path, 'rb').read().decode('utf-8').encode('cp1252').decode('utf-8').encode('cp1252') ).



  1. Rätt sätt att fråga om mysql_num_rows i PHP

  2. MySQLdb.cursor.execute kan inte köra flera frågor

  3. rails + MySQL på OSX:Biblioteket är inte laddat:libmysqlclient.18.dylib

  4. ColdFusion parametrerar en fråga