Convertir sa base de données Jeedom vers UTF8MB4 (Support des Emojis...)

Bonjour à tous,

J’ai eu l’occasion d’échanger en MP avec certains d’entre vous concernant l’ajout d’emojis dans jeedom, qui chez certains ne posent pas de problème, et chez d’autres génèrent de gros messages d’erreur SQL « rouge » et fait planter l’action en cours :confused:

La raison principale :

  • L’encodage de la base de données et de ses tables / colonnes, qui est encore pour certains en UTF8 (et on veut aujourd’hui du UTF8MB4). Or ce format n’accepte pas les caractères codés sur 4 bytes :open_mouth:

Vous allez me dire, c’est quoi le rapport avec les emojis :stuck_out_tongue: et bien sans rentrer dans les détails, les emojis sont stockés justement dans ce format « 4 bytes » en base, et si celle-ci n’accepte pas ce format, cela provoque les fameux gros messages d’erreurs SQL :stuck_out_tongue:

Qui est concerné ?

  • Pas besoin que votre installation Jeedom soit « ancienne » = Même à jour ou réinstallée récemment, si vous restaurez la base via un backup par exemple, cela suffit à faire revenir ce format UTF8 (alors qu’on veut toujours du UTF8MB4 :wink: )
  • La première partie du tuto permet justement de vérifier si on est impacté ou non :wink:

Je vous propose donc le tuto suivant, pour convertir votre base et les tables / colonnes correspondantes en UTF8MB4 :+1:

1 - Par mesure de précaution

Déjà (toujours important avant de toucher à son jeedom) :

  • Faire un backup de Jeedom
  • Et l’exporter en dehors du Jeedom (au cas où, on est jamais trop prudent et c’est de toute manière une bonne pratique)

2 - Convertir la BDD et les tables en UTF8MB4

Dans l’absolu, les bonnes pratiques vous dirait qu’il faut faire cela connecté en SSH sur Jeedom, Jeedom arrêté, et en ligne de commande.

Personnellement, même avec une base qui dépasse 1Go, j’ai tout fait à partir de l’interface de Jeedom.

Je me suis juste assuré de ne pas lancer les commandes à une minute exacte

  • Donc pas à 19h15m00s, mais à 19h15m20s par exemple = pour m’assurer qu’il n’y a pas un CRON 1 min qui s’exécute au moment où je fais les modifs dans la base :wink:

Donc dans l’interface de Jeedom :

  • Aller, via les menus, dans l’interface de gestion de la base de données :
    • Menus : Réglages / Système / Configuration,
    • Puis tout au bout : OS/DB, et dans la page, je choisis Administration Base de données : « Ouvrir »

image

Ensuite, pour toutes les commandes ci-dessous qui sont proposées, je les copie/colle dans le champ « Commande SQL » et j’utilise le bouton « Exécuter » pour les lancer :

image

Les vérifications :

Et donc, dans un premier temps, les vérifications :

  • Pour vérifier l’encodage de la base de données, des tables, et des colonnes, pour voir ce qui est déjà en UTF8MB4 ou pas :

La base de données en elle-même :

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM information_schema.SCHEMATA 
WHERE SCHEMA_NAME = 'jeedom';

Tables qui ne sont pas encore en utf8mb4 :

SELECT TABLE_NAME, TABLE_COLLATION 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'jeedom' 
AND TABLE_COLLATION NOT LIKE 'utf8mb4%';

Colonnes qui ne sont pas encore en utf8mb4 :

SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'jeedom'
AND CHARACTER_SET_NAME IS NOT NULL
AND CHARACTER_SET_NAME != 'utf8mb4';

Ensuite, en fonction de ce qui sera retourné dans les différentes commandes ci-dessus :

Convertir la base de données en UTF8MB4

SI (et seulement SI) la base n’est pas au format utf8mb4 (moi elle l’était déjà par exemple, seules certaines tables de ne l’étaient pas) :

PS : dont pour être tout à fait clair : si la base est déjà en UTF8MB4, pas besoin de lancer la commande ci-dessous, on passe directement à la suite un peu plus bas :wink:

Convertir la BDD en UTF8MB4 :

ALTER DATABASE jeedom 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

Convertir les tables et les colonnes en UTF8MB4

Ensuite, on va convertir les TABLES et les colonnes qui ne sont pas déjà en utf8mb4.

Pour cela, on commence par lancer la commande suivante qui va GENERER une autre commande de type « ALTER TABLE » dynamiquement pour VOTRE système (en gros le résultat n’est valable que sur UN SEUL jeedom, et s’il y en as plusieurs à la maison, il faudra relancer cette commande sur chaque jeedom pour qu’il génère dynamiquement la bonne commande) :

SELECT CONCAT(
  'ALTER TABLE `', TABLE_NAME, 
  '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'jeedom'
AND TABLE_TYPE = 'BASE TABLE';

Ensuite, il faut copier (sélectionner avec votre souris) le résultat et coller l’ensemble dans le champ « Commande SQL » et l’executer (attention à ne pas prendre la première ligne qui est une « entête » / un rappel de ce que cela génère, mais il faut prendre seulement toutes les lignes où il y a marqué « ALTER TABLE […] »)

C’est cette commande « CONVERT TO » qui va convertir le contenu des tables et des colonnes.

En fonction de la taille de la base de données, cela peut prendre plusieurs secondes, voir quelques dizaines de secondes, pas d’inquiétude donc si c’est pas immédiat le résultat :slight_smile: On attend sagement que cela se termine :slight_smile: et en attendant on clique pas partout :stuck_out_tongue:

Vérifier que tout est bien converti

Enfin, il faut vérifier que tout est bien converti, en lancant cette commande de vérification :

Tout doit être au format « utf8mb4 » :

SELECT TABLE_NAME, TABLE_COLLATION 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'jeedom'
AND TABLE_COLLATION NOT LIKE 'utf8mb4%';

Le résultat doit donc être VIDE ! (retourner 0 ligne)

Et après, j’ai rebooté chaque jeedom proprement pour être sûr, et à partir de là, il est possible d’utiliser des emojis un peu partout (équipement, scénarios, dashboard, design, etc..) :+1:

Bonne journée à tous,
TiTidom.

16 « J'aime »

Salut,

Je préciserais quand même de ne faire cela que sur un Debian11 ou plus histoire d’être sur d’avoir une version de MariaDB qui le supporte (et de toute façon il n’y a plus de support de Debian 10 et tout ce qui va avec même s’il doit en rester…)

4 « J'aime »

Merci @TiTidom pour ce tuto
J’ai eu une hésitation, donc je partage pour ceux qui se lancent.
Après le retour de la commande dessus, il faut copier l’ensemble et l’exécuter dans la ligne de commande

1 « J'aime »

Salut,

Bonne remarque de @Mips : c’est en effet fait pour Debian 11, 12, 13, pas pour Debian 10 :+1: Merci :wink:

Merci @SWR : j’ai édité mon message pour prendre en compte le fait d’executer effectivement le résultat de la première commande pour convertir les tables :+1:

TiTidom.

Bonjour,
Ma question est peut-être idiote pour ceux qui connaissent sql mais du coup tu me fou un doute :grinning:
On prend aussi la première ligne qui commence par CONCAT ou pas ? A la lecture j’ai compris qu’il ne fallait copier que celles qui commencent par ALTER TABLE

CONCAT( 'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' )
ALTER TABLE `scenarioSubElement` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `devolo_macinfo` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Salut,

Que celles avec ALTER comme indiqué dans le tuto :yum:

De toute manière si tu prends aussi la première ligne tu vas avoir un message d’erreur :joy::wink:

TiTidom.

1 « J'aime »

Bonjour Titidom,

Ma base est en UTF8MB4 mais general et non unicode il faut tout de même la convertir du coup ? Merci

Bonjour @kwet ,

Oui c’est conseillé.

Je dis bien conseillé et pas obligatoire, mais le general_ci est plus « ancien » que le unicode_ci qui est une implémentation plus moderne et récente, et cela pourrait avoir des impacts sur des fonctions de tri et de comparaison (notamment pour les caractères accentués par exemple).

Donc quitte à tout mettre au propre, autant le faire dans ton cas :wink:

Bonne journée,
TiTidom.

1 « J'aime »

Merci, migration des bases terminées, très rapide et très bien expliqué.
J’ai déjà été confronté en plus à ce soucis avec un script qui utilisait des emojis !

Merci

Bonjour,

Si cela ne présente aucun risque, pourquoi ce n’est pas le core lors d’une maj qui fait cela ?

Après une tel manip lors d’une vérification de la base de données depuis le menu configuration vous n’avez pas de correction d’index ou autre ?

1 « J'aime »

Tous les Status sont OK.

Bonjour à tous

Procédure appliquée avec succès ce weekend sur ma box Atlas, merci à @TiTidom

Bonjour et merci pour ce tuto très bien réalisé,

Tout c’est bien passé.

Si vous faites Vérification générale, à la première vous avez les fix alter table qui apparaissent et à la deuxième Vérification c’est clean.
Sur 2 jeedom j’ai eu une incohérence de date dans la table cache, des dates de 2016. Table effacée et elle s’est recréé sans erreur.

Ah ben voila au premier check y a bien des trucs

Comme écrit plus haut, pour moi aucun problème dés la première fois. Et cela aussi pour Vérification Générale.

Pareil chez moi.

En cas de besoin, j’ai les logs de coté.