it-swarm.com.de

Ändern Sie die Standardkollatierung für den Zeichensatz utf8mb4 in utf8mb4_unicode_ci

Beim Erstellen einer Datenbank ohne Angabe eines Zeichensatzes oder einer Sortierung werden (wie erwartet) die Serverstandards verwendet.

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     |
+------------------------+

Wenn Sie jedoch den Zeichensatz in der Abfrage CREATE DATABASE - angeben, ändert sich die Standardkollatierung in 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     |
+------------------------+

Ich habe bereits herausgefunden, dass ( mysql-manual )

Wenn CHARACTER SET charset_name ohne COLLATE angegeben wird, werden charset_name und seine Standardkollatierung verwendet. Verwenden Sie die Anweisung SHOW CHARACTER SET oder fragen Sie die Tabelle INFORMATION_SCHEMA CHARACTER_SETS ab, um die Standardkollatierung für jeden Zeichensatz anzuzeigen.

Und tatsächlich zeigt es utf8mb4_general_ci, Also folgt es den Regeln

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

Meine Frage lautet also: Wie ändere ich diese Standardkollatierung für den Zeichensatz utf8mb4. Gibt es eine Konfigurationsdatei, die ich ändern kann, um dieses Verhalten zu ändern? Ich möchte wirklich, dass diese beiden konsistent sind.

Natürlich habe ich versucht, bei Google relevante Informationen zu finden, aber ich kann nur die Einstellung collation_server Ändern.

Serverversion: 10.3.15-MariaDB-Protokoll MariaDB Server

5

Ich glaube nicht, dass es eine Möglichkeit gibt, das DEFAULT zu ändern.

Auf jeden Fall wäre es besser, utf8mb4_unicode_520_ci, das auf einem späteren Unicode-Standard basiert.

Gewöhnen Sie sich einfach an, CHARACTER SET und COLLATION auf allen Verbindungen und CREATE TABLEs. MySQL und MariaDB ändern sich allmählich von latin1_swedish_ci zu utf8mb4_0900_ai_ci. MariaDB ist noch nicht da, aber ich gehe davon aus, dass sie bald umziehen werden. Und "900" ist wahrscheinlich nicht der letzte Unicode-Standard.

Indem Sie den Zeichensatz und die Sortierung explizit angeben, behalten Sie die Kontrolle und Konsistenz, auch wenn es sich um ein veraltetes Paar handelt.

Ein Kompromiss...

Aber Zeichensatz und Sortierung auf CREATE DATABASE. Dann erben alle Tabellen, die ohne spezifische Einstellungen erstellt wurden, diese Einstellungen. Und Spalten in dieser Tabelle erben von den Einstellungen der Tabelle.

4
Rick James

Option 1

  1. WENN Sie MySQL 8.0.11 oder neuer verwenden (nicht sicher, wie das MariaDB 10.3.15 entspricht), und
  2. WENN Sie in Ordnung sind, verwenden Sie utf8mb4_0900_ai_ci Anstelle von utf8mb4_unicode_ci

dann scheint es, dass eine Serversystemvariable - @@ default_collation_for_utf8mb4 - in 8.0.11 hinzugefügt wurde, aber die einzigen gültigen Werte sind:

  • utf8mb4_general_ci
  • utf8mb4_0900_ai_ci

Wenn Sie jedoch eine Standardkollatierung von utf8mb4_general_ci Für utf8mb4 Anstelle von utf8mb4_0900_ai_ci Sehen, dann vermute ich, dass Sie diese neue Systemvariable nicht haben.

Option 2

Die Dokumentation zeigt einen Mechanismus zum Definieren Ihrer eigenen UCA-Sortierung, obwohl unklar ist, ob dies zum Überschreiben eines Standards verwendet werden kann. Ich kann es nicht testen, aber es lohnt sich, Folgendes zu untersuchen:

Alles in allem funktioniert Folgendes: könnte funktionieren (aber ich habe auch keine Möglichkeit zu testen):

<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>

In der Dokumentation heißt es nun:

Sie müssen jeder Sortierung eine eindeutige ID-Nummer zuweisen. Der ID-Bereich von 1024 bis 2047 ist für benutzerdefinierte Sortierungen reserviert. Verwenden Sie diese Abfrage, um das Maximum der aktuell verwendeten Kollatierungs-IDs zu ermitteln:

     SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;

Ich habe jedoch die tatsächlichen IDs verwendet, mit der Idee, dass wir lediglich die Standardeinstellung ändern, nicht mit einer Basissortierung beginnen und neue Regeln hinzufügen. Ich habe die Ausweise hier gefunden;

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

Option 3

Wenn alles andere fehlschlägt, würde ich diese Frage im folgenden MySQL-Forum veröffentlichen, da Sie anscheinend ziemlich maßgebliche Antworten erhalten (basierend darauf, wer einige dieser Fragen beantwortet):

MySQL-Foren: Zeichensätze, Sortierung, Unicode

1
Solomon Rutzky