Mysql
 sql >> Datenbank >  >> RDS >> Mysql

UTF-8-Strings in einer MySQL-Datenbank wurden nach Konfigurationsänderung durcheinander gebracht

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

Das erhalten Sie, wenn Sie die Bytefolge als UTF-8 behandeln und sie dann als ISO-8859-1 codieren. 3F ist ? , das als Ersatzzeichen eingefügt wurde, weil UTF-8 C6 92 ist U+0192 ƒ die in ISO-8859-1 nicht existiert. Aber es existiert in der Windows-Codepage 1252 Western European, einer Codierung, die ISO-8859-1 sehr ähnlich ist; dort ist es Byte 0x83.

C3 83 C2 AA

Gehen Sie eine weitere Runde von Treat-as-UTF-8-bytes-and-encode-to-cp1252 durch und Sie erhalten:

C3 AA

was schließlich UTF-8 für ê ist .

Beachten Sie, dass selbst wenn Sie eine Nicht-XML-HTML-Seite explizit als ISO-8859-1 bereitstellen, Browser tatsächlich die cp1252-Codierung verwenden, aus unangenehmen historischen Gründen.

Leider hat MySQL keine cp1252-Kodierung; latin1 ist (korrekterweise) ISO-8859-1. Sie können die Daten also nicht reparieren, indem Sie sie als latin1 ausgeben und dann als utf8 (zweimal) neu laden. Sie müssten das Skript mit einem Texteditor bearbeiten, der entweder speichern kann (oder z. B. in Python file(path, 'rb').read().decode('utf-8').encode('cp1252').decode('utf-8').encode('cp1252') ).