Nuestro programador anterior estableció la clasificación incorrecta en una tabla (Mysql). Lo configuró con intercalación latina, cuando debería ser UTF8, y ahora tengo problemas. Todos los discos con caracteres chinos y japoneses recurren a ??? personaje.
¿Es posible cambiar la colación y recuperar los detalles del personaje?
Respuestas:
cambiar la clasificación de la base de datos:
cambiar la clasificación de la tabla:
cambiar colación de columna:
¿Qué significan las partes de
utf8mb4_0900_ai_ci
?Más información:
fuente
CHARACTER SET utf8
con el valor predeterminado,utf8_general_ci
pero también puede definir la intercalación de esta maneraALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
si es necesariocreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
; si desea cambiarlo autf8_unicode_ci
, se puede definir el cotejo:ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Esto funciona en tablas exactamente igual que en bases de datos, como ha señalado @KCD.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Debe hacer lo mismo para las otras dos declaraciones.Aquí está cómo cambiar todas las bases de datos / tablas / columnas. Ejecute estas consultas y generarán todas las consultas posteriores necesarias para convertir todo su esquema a utf8. ¡Espero que esto ayude!
- Cambiar la clasificación predeterminada de la BASE DE DATOS
- Cambiar TABLE Collation / Char Set
- Cambiar COLUMNA Intercalación / Conjunto de caracteres
fuente
Tenga en cuenta que en Mysql, el
utf8
juego de caracteres es solo un subconjunto del juego de caracteres UTF8 real. Para guardar un byte de almacenamiento, el equipo de Mysql decidió almacenar solo tres bytes de caracteres UTF8 en lugar de los cuatro bytes completos. Eso significa que algunos idiomas y emoji de Asia oriental no son totalmente compatibles. Para asegurarse de que puede almacenar todos los caracteres UTF8, use elutf8mb4
tipo de datosutf8mb4_bin
outf8mb4_general_ci
Mysql.fuente
utf8mb4_unicode_ci
lugar deutf8mb4_general_ci
. Ver stackoverflow.com/questions/766809/… y drupal.stackexchange.com/questions/166405/…Además de lo que David Whittaker publicó, he creado una consulta que genera la tabla completa y la declaración de modificación de columnas que convertirá cada tabla. Puede ser una buena idea correr
SET SESSION group_concat_max_len = 100000;
primero para asegurarse de que su grupo concat no exceda el límite muy pequeño como se ve aquí .
Una diferencia aquí entre la respuesta anterior es que estaba usando utf8 en lugar de ut8mb4 y usando t1.data_type con t1.CHARACTER_MAXIMUM_LENGTH no funcionó para las enumeraciones. Además, mi consulta excluye las vistas, ya que tendrán que modificarse por separado.
Simplemente utilicé un script de Perl para devolver todos estos cambios como una matriz e iteré sobre ellos, arreglé las columnas que eran demasiado largas (generalmente eran varchar (256) cuando los datos generalmente solo tenían 20 caracteres en ellos, así que fue una solución fácil )
Encontré que algunos datos estaban dañados al alterar desde latin1 -> utf8mb4. Parecía que los caracteres latin1 codificados en utf8 en las columnas se burlarían en la conversión. Simplemente mantuve datos de las columnas que sabía que iban a ser un problema en la memoria antes y después de la modificación y los comparé y generé declaraciones de actualización para corregir los datos.
fuente
Aquí describe bien el proceso. Sin embargo, algunos de los personajes que no encajaban en el espacio latino desaparecieron para siempre. UTF-8 es un SUPERSET de latin1. No al revés. La mayoría encajará en un espacio de un solo byte, pero los indefinidos no (verifique una lista de latin1; no todos los 256 caracteres están definidos, dependiendo de la definición de mysql latin1)
fuente