sql >> Base de Datos >  >> RDS >> Mysql

Las cadenas UTF-8 en una base de datos MySQL se estropearon después del cambio de configuración

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

Eso es lo que obtiene si trata la secuencia de bytes como UTF-8 y luego la codifica como ISO-8859-1. 3F es ? , que se ha incluido como carácter de sustitución, porque UTF-8 C6 92 es U+0192 ƒ que no existe en ISO-8859-1. Pero sí existe en la página de códigos de Windows 1252 de Europa Occidental, una codificación muy similar a la ISO-8859-1; allí, es el byte 0x83.

C3 83 C2 AA

Realice otra ronda de tratar como UTF-8-bytes-y-encode-to-cp1252 y obtendrá:

C3 AA

que es, finalmente, UTF-8 para ê .

Tenga en cuenta que incluso si publica una página HTML que no es XML explícitamente como ISO-8859-1, los navegadores en realidad usarán la codificación cp1252, debido a razones históricas desagradables.

Desafortunadamente, MySQL no tiene una codificación cp1252; latin1 es (correctamente) ISO-8859-1. Por lo tanto, no podrá arreglar los datos volcando como latin1 y luego recargando como utf8 (dos veces). Tendría que procesar el script con un editor de texto que pueda guardar como (o, por ejemplo, en Python file(path, 'rb').read().decode('utf-8').encode('cp1252').decode('utf-8').encode('cp1252') ).