Notre programmeur précédent a défini le mauvais classement dans une table (Mysql). Il l'a mis en place avec le classement latin, alors qu'il devrait être UTF8, et maintenant j'ai des problèmes. Chaque disque avec des caractères chinois et japonais se transforme en ??? personnage.
Est-il possible de changer le classement et de récupérer le détail du personnage?
Réponses:
modifier le classement de la base de données:
modifier le classement de la table:
modifier le classement des colonnes:
Que
utf8mb4_0900_ai_ci
signifient les parties de ?Plus d'informations:
la source
CHARACTER SET utf8
- vous sera par défaut,utf8_general_ci
mais vous pouvez également définir le classement comme celui-ciALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
si nécessairecreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
; si vous voulez changer pourutf8_unicode_ci
, vous pouvez définir la collation:ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Cela fonctionne sur les tables exactement de la même manière que sur les bases de données, comme @KCD l'a souligné.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Vous devez faire de même pour les deux autres instructions.Voici comment changer toutes les bases de données / tables / colonnes. Exécutez ces requêtes et elles afficheront toutes les requêtes suivantes nécessaires pour convertir l'ensemble de votre schéma en utf8. J'espère que cela t'aides!
- Modifier le classement par défaut de la base de données
- Modifier le classement / le jeu de caractères de TABLE
- Modifier le classement / le jeu de caractères COLUMN
la source
Attention, dans Mysql, le
utf8
jeu de caractères n'est qu'un sous-ensemble du jeu de caractères UTF8 réel. Afin d'économiser un octet de stockage, l'équipe Mysql a décidé de ne stocker que trois octets de caractères UTF8 au lieu des quatre octets complets. Cela signifie que certaines langues et emoji d'Asie de l'Est ne sont pas entièrement pris en charge. Pour vous assurer que vous pouvez stocker tous les caractères UTF8, utilisez leutf8mb4
type de données et /utf8mb4_bin
ouutf8mb4_general_ci
dans Mysql.la source
utf8mb4_unicode_ci
place deutf8mb4_general_ci
. Voir stackoverflow.com/questions/766809/… et drupal.stackexchange.com/questions/166405/…En plus de ce que David Whittaker a publié, j'ai créé une requête qui génère la table complète et l'instruction alter des colonnes qui convertira chaque table. Ce peut être une bonne idée de courir
SET SESSION group_concat_max_len = 100000;
d'abord pour vous assurer que votre groupe concat ne dépasse pas la très petite limite vue ici .
Une différence ici entre la réponse précédente est qu'elle utilisait utf8 au lieu de ut8mb4 et l'utilisation de t1.data_type avec t1.CHARACTER_MAXIMUM_LENGTH ne fonctionnait pas pour les énumérations. De plus, ma requête exclut les vues car celles-ci devront être modifiées séparément.
J'ai simplement utilisé un script Perl pour renvoyer toutes ces modifications sous forme de tableau et les ai itérées, j'ai corrigé les colonnes trop longues (généralement elles étaient varchar (256) lorsque les données ne contenaient généralement que 20 caractères, donc c'était une solution facile. ).
J'ai trouvé que certaines données étaient corrompues lors de la modification de latin1 -> utf8mb4. Il semble que les caractères latin1 encodés en utf8 dans les colonnes soient gaffés lors de la conversion. J'ai simplement conservé les données des colonnes dont je savais qu'elles allaient être un problème en mémoire avant et après le changement et les ai comparées et j'ai généré des instructions de mise à jour pour corriger les données.
la source
décrit ici bien le processus. Cependant, certains des personnages qui ne correspondaient pas à l'espace latin ont disparu pour toujours. UTF-8 est un SUPERSET de latin1. Pas l'inverse. La plupart tiendront dans un espace d'un octet, mais tous ceux non définis ne le seront pas (vérifiez une liste de latin1 - tous les 256 caractères ne sont pas définis, selon la définition latin1 de mysql)
la source