Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci

Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci

par Séverin Terrier,
Nombre de réponses : 7
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Certains risquent d'ouvrir des grands yeux, avec la découverte de cet interclassement pour MySQL (et MariaDB).

Son intérêt : combiné avec le jeu de caractères utf8mb4, il permet d'utiliser tout type de caractère, y compris les caractères asiatiques et les emojis sourire

Moodle en lui-même est compatible depuis de nombreuses versions, étant donné que le "blocage" était au niveau de MySQL.

Moodle 3.1.5 et 3.2.2 intègrent un script (en ligne de commande) permettant de modifier de façon automatique les paramètres de MySQL, pour passer à ce jeu de caractères et cet interclassement. A partir de ces versions, une installation neuve essayera d'utiliser ces paramètres. Vous en saurez plus depuis la documentation vers le support UTF-8 complet pour MySQL.

Attention : pour que cela puisse fonctionner, il faudra disposer d'un minimum de pré-requis et de droits, au niveau MySQL. Cela ne sera donc pas possible partout (chez tous les hébergeurs) !

Malgré tout, ne vous inquiétez pas : il n'y a aucun problème à continuer d'utiliser utf8_unicode_ci, hormis celui de ne pas permettre les caractères asiatiques et les emojis. Même Moodle 3.3 ne fera qu'afficher un avertissement et un encouragement à passer vers ce nouvel interclassement.

Séverin

Moyenne des évaluations  -
En réponse à Séverin Terrier

Re: Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci - Requête SQL

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

J'avais ouvert précédemment une discussion sur la façon de modifier l'interclassement de MySQL (et MariaDB) via une interface web donnant accès aux tables de Moodle.

Sur le même principe, j'ai modifié mon script, afin de générer les lignes permettant de modifier l'interclassement des tables vers utf8mb4_unicode_ci (mais aussi utf8_unicode_ci si besoin).

Pré-requis à l'utilisation : pouvoir utiliser la ligne de commande MySQL, ou installer le plugin Moodle Adminer (qui permet l'accès à la base de données). Attention, le script ne fonctionnera pas avec PhpMyAdmin (celui-ci insérant une limite) !

Pour utiliser le script, il faut :

  1. accéder à Moodle Adminer, depuis "Administration du site > Serveur > Moodle Adminer"
  2. sélectionner la base de données
  3. cliquer sur "Requête SQL"

C'est à cet endroit que l'on va ensuite pouvoir exécuter les différentes requêtes.

Et voici le script en question (la première partie est auto-explicative, et pourrait être enlevée du script en lui-même) :

-- =============== Présentation             ===============
-- Cette requête, spécifique à MySQL (et MariaDB) sert à modifier
--
l'interclassement des tables d'une base de données Moodle existante.
-- =============== Instructions à suivre    ===============
-- 1 : adapter le nom de la base de données
-- 2 : SI utf8_unicode_ci
est souhaité, commenter la ligne avec utf8mb4_unicode_ci
-- 3 : lancer la requête
-- 4 : lancer les requêtes générées en première colonne
-- 5 : relancer cette requête
-- 6 : lancer les requêtes générées en seconde colonne

--
=============== Définition des variables ===============
SET @BASE      = 'moodle';               -- Le nom de la base de données (à adapter)
SET @COLLATION = 'utf8_unicode_ci';      -- Pour choisir utf8_unicode_ci, il faut
SET @COLLATION = 'utf8mb4_unicode_ci';   -- commenter CETTE ligne avec "-- " au début
SET @CHARSET   = SUBSTRING_INDEX(@COLLATION, '_', 1);

-- Pour lancer la requête, il FAUT intégrer les différentes lignes SET ci-dessus
-- La requête en elle-même ne doit PAS être modifiée !
SELECT
CONCAT('ALTER TABLE ', @BASE, '.', table_name, ' CONVERT TO CHARACTER SET ', @CHARSET, ' COLLATE ', @COLLATION, ';')
AS 'Remplacement 1 : contenu'
,CONCAT('ALTER TABLE ', @BASE, '.', table_name, ' CHARACTER SET ', @CHARSET, ' COLLATE ', @COLLATION, ';')
AS 'Remplacement 2 : conteneur'

FROM   information_schema.tables
WHERE  table_schema     = @BASE          -- Le nom de la base à traiter
AND  table_collation != @COLLATION     -- Le nom de l'interclassement souhaité
GROUP BY table_name;

Comme le script intégré à Moodle, cette requête peut rester inopérante si vous n'avez pas les pré-requis et droits nécessaires au niveau de MySQL (ou MariaDB).

Voila, j'espère que les explications ainsi que cette requête seront utiles.

Séverin

Moyenne des évaluations Utile (3)
En réponse à Séverin Terrier

Re: Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci - Requête SQL

par Sébastien Mehr,
Avatar Développeurs Avatar Testeurs

Hello Séverin,

Merci pour toutes ces précisions. J'avais effectivement repéré ce changement dans la note de version sans m'y être pencher dessus , tu vas me faire gagner du temps clin d’œil !


Seb

En réponse à Sébastien Mehr

Re: Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci - Requête SQL

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Avec plaisir sourire

C'est "un peu" le principe et le but de la communauté : faire gagner du temps (aux autres), et en gagner soi-même, tout cela grâce au partage des connaissances et compétences.

Séverin

Moyenne des évaluations Utile (2)
En réponse à Séverin Terrier

Re: Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci - Requête SQL

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Si certaines personnes tombent sur cette discussion (suite à des recherches), je précise que la requête ci-dessus modifie l'interclassement des tables, mais pas celui des colonnes. Cela reste donc incomplet.

Je vous suggère fortement de lire cette autre discussion à propos du support unicode complet pour MySQL, qui propose une solution en ligne de commande, via un export de la base de données, puis ré-importation.

Séverin

En réponse à Séverin Terrier

Re: Modifier l'interclassement de MySQL (ou MariaDB) pour utf8mb4_unicode_ci

par Nicolas Martignoni,
Avatar Développeurs Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Avant que quelqu'un ne pose la question : les versions de la MoodleBox depuis la 1.6.1 (4 mars 2017)  prennent en compte cette modification, sans nécessiter de modification.

Moyenne des évaluations Utile (2)