Retour d'expérience sur la conversion UTF8 vers UTF8-mb4

Première étape, trouver comment assurer, directement avec Sequel Ace, la conversion de l’encodage et du jeu de caractères utilisés de la base de données, des tables et des champs.

J’ai finalement dégoté ce script, qui permet de produire une série de requêtes SQL en fonction de ce qui est présent dans une base de données :

USE information_schema;
SELECT "SET SESSION innodb_strict_mode=OFF, NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';" as _sql
UNION
SELECT concat("SET foreign_key_checks = 0;") as _sql
UNION
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql FROM `TABLES` where table_schema like "DOTCLEAR" group by table_schema
UNION
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` ENGINE=InnoDB ROW_FORMAT=COMPRESSED;") as _sql
FROM `TABLES` where table_schema like "DOTCLEAR" group by table_schema, table_name
UNION
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "DOTCLEAR" group by table_schema, table_name
UNION
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `COLUMNS` where table_schema like "DOTCLEAR" and data_type in ('varchar')
UNION
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `COLUMNS` where table_schema like "DOTCLEAR" and data_type in ('text','tinytext','mediumtext','longtext')
UNION
SELECT concat("SET foreign_key_checks = 1;") as _sql;

Deux choses par rapport au script original :

  1. J’ai remplacé utf8mb4_general_ci par utf8mb4_unicode_ci partout dans le script, ça permet d’avoir un traitement plus générique pour les langues étrangères.

  2. J’ai bien évidemment remplacé le nom de la base relution par la mienne, notée plus haut DOTCLEAR ; c’est donc à adapter en fonction du cas rencontré.

Ensuite, plutôt que de travailler directement sur la base originale — la suite montrera que c’était judicieux — j’ai préféré exporter, créer une nouvelle base (UTF8) et importer dedans les données exportées.

Application du script généré plus haut, contenant toutes les requêtes de modification, éradication des clés dupliquées présentes dans la base (quelques URLs liées aux deux planets que j’avais monté un temps, et pour finir renommer les noms de l’ancienne (UTF8) et de la nouvelle base (UTF8-mb4) pour voir comment ça se comportait.

Eh bien jusqu’à la connexion, l’affichage, etc… Tout va bien, par contre j’ai du faire marche arrière parce qu’il m’est impossible de créer un nouveau billet avec la nouvelle !

Il reste des mystères mystérieux qu’il va falloir que j’investigue…

Possiblement une histoire de longueur de clé d’index, limitée à 255 caractères avec UTF8 et 191 caractères avec UTF8-mb4 ; mais mes tests ne sont pas concluants sur ce sujet non plus. Et c’est confirmé avec quelques requêtes SQL qui m’indiquent que la plus longue clé existante fait 129 caractères de long. Il va donc falloir chercher ailleurs. Les requêtes utilisées :

SELECT MAX(LENGTH(CONCAT(`cat_url`, `blog_id`))) AS ln FROM `dc_category`;
SELECT MAX(LENGTH(CONCAT(`post_id`, `ping_url`))) AS ln FROM `dc_ping`;
SELECT MAX(LENGTH(CONCAT(`post_url`, `post_type`, `blog_id`))) as ln FROM `dc_post`;
SELECT MAX(LENGTH(CONCAT(`pref_ws`, `pref_id`, `user_id`))) as ln FROM `dc_pref`;
SELECT MAX(LENGTH(CONCAT(`setting_ns`, `setting_id`, `blog_id`))) as ln FROM `dc_setting`;

Je me demande s’il n’y a pas une histoire de réglage de serveur parce celui que j’utilise localement gère correctement la base convertie au contraire de l’officiel qui gère ce blog (entre autres choses). À ce niveau ça devient plus complexe de prévoir quelque chose de générique côté Dotclear, à part limiter les longueurs de ce qui est inclus dans les clés.

En attendant retour à la base originale et réactivation du plugin utf8mb4 finalement bien pratique :-)

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15580

Haut de page