web-dev-qa-db-fra.com

Modifier le classement par défaut du jeu de caractères utf8mb4 en utf8mb4_unicode_ci

Lors de la création d'une base de données sans spécifier de jeu de caractères ou de classement, les valeurs par défaut des serveurs sont utilisées (comme prévu).

MariaDB [(none)]> SHOW VARIABLES LIKE '%_server' ;
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| character_set_server | utf8mb4            |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+

MariaDB [(none)]> CREATE DATABASE `test-without-charset` ;
MariaDB [(none)]> SELECT `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` LIKE 'test-without-charset';
+------------------------+
| DEFAULT_COLLATION_NAME |
+------------------------+
| utf8mb4_unicode_ci     |
+------------------------+

Cependant, lorsque vous spécifiez le jeu de caractères dans le CREATE DATABASE- requête, le classement par défaut devient utf8mb4_general_ci.

MariaDB [(none)]> CREATE DATABASE `test-with-charset` CHARACTER SET utf8mb4 ;
MariaDB [(none)]> SELECT `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` LIKE 'test-with-charset';
+------------------------+
| DEFAULT_COLLATION_NAME |
+------------------------+
| utf8mb4_general_ci     |
+------------------------+

J'ai déjà découvert que ( mysql-manual )

Si CHARACTER SET nom_charset est spécifié sans COLLATE, le jeu de caractères nom_charset et son classement par défaut sont utilisés. Pour voir le classement par défaut de chaque jeu de caractères, utilisez l'instruction SHOW CHARACTER SET ou interrogez la table INFORMATION_SCHEMA CHARACTER_SETS.

Et en effet, cela montre utf8mb4_general_ci, il suit donc les règles

MariaDB [(none)]> SHOW CHARACTER SET LIKE 'utf8mb4';
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+

Ma question est donc la suivante: comment modifier ce classement par défaut pour le jeu de caractères utf8mb4. Existe-t-il un fichier de configuration que je peux modifier pour modifier ce comportement? J'aimerais vraiment que ces deux soient cohérents.

Bien sûr, j'ai essayé Google pour trouver quelque chose de pertinent, mais tout ce que je peux trouver, c'est de changer le collation_server-réglage.

Version du serveur: 10.3.15-MariaDB-log MariaDB Server

5

Je ne pense pas qu'il existe un moyen de changer cela DEFAULT.

Quoi qu'il en soit, il serait préférable d'utiliser utf8mb4_unicode_520_ci, qui est basé sur une norme Unicode ultérieure.

Prenez simplement l'habitude de spécifier CHARACTER SET et COLLATION sur toutes les connexions et CREATE TABLEs. MySQL et MariaDB passent progressivement de latin1_swedish_ci à utf8mb4_0900_ai_ci. MariaDB n'est pas encore là, mais je m'attends à ce qu'ils déménagent bientôt. Et "900" n'est probablement pas le dernier standard Unicode.

En spécifiant explicitement le jeu de caractères et le classement, vous conservez le contrôle et la cohérence, même s'il s'agit d'une paire obsolète.

Un compromis...

Mais charset et collation sur CREATE DATABASE. Ensuite, toutes les tables construites sans paramètres spécifiques hériteront de ces paramètres. Et les colonnes de cette table hériteront des paramètres de la table.

4
Rick James

Option 1

  1. SI vous utilisez MySQL 8.0.11 ou plus récent (vous ne savez pas comment cela équivaut à MariaDB 10.3.15), et
  2. SI vous êtes d'accord en utilisant utf8mb4_0900_ai_ci au lieu de utf8mb4_unicode_ci

alors il semble qu'une variable système du serveur - @@ default_collation_for_utf8mb4 - a été ajoutée au 8.0.11, mais les seules valeurs valides sont:

  • utf8mb4_general_ci
  • utf8mb4_0900_ai_ci

Cependant, si vous voyez un classement par défaut de utf8mb4_general_ci pour utf8mb4 au lieu de utf8mb4_0900_ai_ci, alors je suppose que vous n'avez pas cette nouvelle variable système.

Option 2

La documentation montre un mécanisme pour définir votre propre classement UCA, bien qu'il ne soit pas clair si cela peut être utilisé pour remplacer une valeur par défaut. Je ne peux pas le tester, mais cela vaut la peine d'examiner:

En mettant tout cela ensemble, le - peut-être travail (mais encore une fois, je n'ai aucun moyen de tester):

<charset name="utf8mb4">
  <family>Unicode</family>
  <description>UTF-8 MB4 Unicode</description>
  <collation name="utf8mb4_unicode_ci" id="224">
    <flag>primary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_general_ci" id="45">
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_bin"     id="46">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_unicode_520_ci"     id="246">
    <flag>compiled</flag>
  </collation>
</charset>

Maintenant, la documentation indique:

Vous devez attribuer un numéro d'identification unique à chaque classement. La plage d'ID de 1024 à 2047 est réservée aux classements définis par l'utilisateur. Pour trouver le maximum des ID de classement actuellement utilisés, utilisez cette requête:

     SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;

Cependant, j'ai utilisé les ID réels avec l'idée étant que nous modifions simplement la valeur par défaut, ne commençant pas par un classement de base et ajoutant de nouvelles règles. J'ai trouvé les identifiants ici;

https://github.com/mysql/mysql-server/blob/8.0/mysql-test/suite/engines/funcs/r/db_alter_collate_ascii.result

Option 3

Si tout le reste échoue, je posterais cette question sur le forum MySQL suivant car il semble que vous obtiendrez des réponses plutôt autoritaires (en fonction de qui répond à certaines de ces questions):

Forums MySQL: jeux de caractères, assemblage, Unicode

1
Solomon Rutzky