In MariaDB kann die Sortierung auf vielen Ebenen angewendet werden. Die Sortierung kann auf Serverebene, Verbindungsebene, Datenbankebene, Tabellenebene und sogar auf Spaltenebene angewendet werden.
Es ist auch möglich, eine Sortierung auf Abfrageebene anzugeben, sodass sie jede Sortierung überschreibt, die auf Datenbank-, Tabellen- oder Spaltenebene angewendet wurde.
MariaDB bietet eine Reihe von Optionen zum Zurückgeben der Sortierung auf den verschiedenen Ebenen.
Verbindung, Server und Datenbanksortierung anzeigen
Wir können die SHOW VARIABLES
verwenden Verwaltungsanweisung mit dem LIKE
-Klausel, um Variablen zurückzugeben, die eine bestimmte Zeichenfolge in ihrem Namen enthalten.
Beispiel:
SHOW VARIABLES LIKE 'collation%';
Beispielergebnis:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Dies sind die Ergebnisse, die ich in meiner Testumgebung erhalte. Das Ergebnis hängt von Ihren Einstellungen ab.
Jede dieser separaten Variablen kann bei Bedarf separat zurückgegeben werden (siehe unten).
Standardmäßig SHOW VARIABLES
zeigt die SESSION
Variablen. In diesem Fall werden die Werte zurückgegeben, die für die aktuelle Verbindung gelten.
Daher könnte das vorherige Beispiel wie folgt umgeschrieben werden:
SHOW SESSION VARIABLES LIKE 'collation%';
Beispielergebnis:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Alternativ können Sie SESSION
ersetzen mit LOCAL
(was ein Synonym für SESSION
ist ):
SHOW LOCAL VARIABLES LIKE 'collation%';
Sie können auch den GLOBAL
verwenden Modifikator, um die Werte anzuzeigen, die für neue Verbindungen zu MariaDB verwendet werden.
Beispiel:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Beispielergebnis:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Serversortierung
Der folgende Befehl gibt die Standardsortierung des Servers zurück:
SELECT @@collation_server;
Beispielergebnis:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Sortierung auf Verbindungsebene
Wenn Sie eine Abfrage für eine MariaDB-Datenbank ausführen, verwendet MariaDB eine Reihe von Systemvariablen, um zu bestimmen, welcher Zeichensatz und welche Sortierung verwendet werden sollen, wenn Abfragen ausgeführt werden. Wenn der Client einen anderen Zeichensatz als der Server verwendet, kann MariaDB ihn in einen geeigneten Zeichensatz und eine entsprechende Sortierung übersetzen.
Beim Zurücksenden der Abfrageergebnisse an den Client kann MariaDB diese Ergebnisse bei Bedarf vollständig in einen anderen Zeichensatz zurückübersetzen. MariaDB verwendet Systemvariablen, um zu bestimmen, welche Zeichensätze und Sortierungen bei jedem dieser Schritte verwendet werden sollen.
Das Folgende hebt die Verbindungssortierung hervor (Sie können dieselbe Syntax für alle Systemvariablen verwenden):
SELECT @@collation_connection;
Beispielergebnis:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
Sie können auch alle Zeichensatz-Systemvariablen mit der folgenden Abfrage zurückgeben:
SHOW VARIABLES LIKE 'character_set%';
Ergebnis:
+--------------------------+--------------------------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/local/Cellar/mariadb/10.5.9/share/mysql/charsets/ | +--------------------------+--------------------------------------------------------+
Vergleich auf Datenbankebene
Die folgende Anweisung kann verwendet werden, um die Sortierung einer bestimmten Datenbank zu überprüfen:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Beispielergebnis:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Eine andere Möglichkeit, dies zu tun, besteht darin, eine Anweisung wie diese zu verwenden:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Beispielergebnis:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
Mit dieser zweiten Methode können Sie die Ergebnisse abrufen, ohne die Datenbank wechseln zu müssen.
Hier wird eine andere Datenbank verwendet:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Beispielergebnis:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Dies ist die Testdatenbank, die erstellt wurde, als ich MariaDB zum ersten Mal installierte.
Sortierung auf Tabellenebene
Die folgende Anweisung gibt eine Reihe von Spalten zurück, die Informationen über alle übereinstimmenden Tabellen enthalten. Eine dieser Spalten heißt Collation , und es stellt die Sortierung aller übereinstimmenden Tabellen bereit.
SHOW TABLE STATUS LIKE '%Pets%';
Beispielergebnis (mit vertikaler Ausgabe):
*************************** 1. row *************************** Name: Pets Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 8 Avg_row_length: 2048 Data_length: 16384 Max_data_length: 0 Index_length: 32768 Data_free: 0 Auto_increment: NULL Create_time: 2021-03-30 09:10:38 Update_time: 2021-03-30 09:16:39 Check_time: NULL Collation: utf8mb4_general_ci Checksum: NULL Create_options: Comment: Max_index_length: 0 Temporary: N
In diesem Fall habe ich Informationen über eine Tabelle namens Pets
erhalten . Wir können sehen, dass die Collation
Spalte enthält utf8mb4_general_ci
, das ist die Sortierung der Tabelle.
Diese Anweisung akzeptiert auch andere Klauseln wie FROM
, WHERE
, und IN
, das gibt Ihnen also einige Optionen beim Erstellen Ihrer Erklärung.
Eine andere Möglichkeit, Sortierungsinformationen zu Ihren Tabellen zu erhalten, besteht darin, eine Abfrage für information_schema.tables
auszuführen :
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Beispielergebnis:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Sortierung auf Spaltenebene
Das Ausführen der folgenden Abfrage gibt Informationen zu jeder Spalte in Pets
zurück Tisch. Dazu gehören die Kollationsinformationen.
SHOW FULL COLUMNS FROM Pets;
Beispielergebnis:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | PetId | int(11) | NULL | NO | PRI | NULL | | select,insert,update,references | | | PetTypeId | int(11) | NULL | NO | MUL | NULL | | select,insert,update,references | | | OwnerId | int(11) | NULL | NO | MUL | NULL | | select,insert,update,references | | | PetName | varchar(60) | utf8mb4_general_ci | NO | | NULL | | select,insert,update,references | | | DOB | date | NULL | YES | | NULL | | select,insert,update,references | | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
Alternativ können wir information_schema.columns
abfragen . In diesem Fall können wir nur die Spalten auswählen, die uns interessieren:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Beispielergebnis:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
Und eine weitere Option, die wir in unserem Toolkit haben, ist das Ausprobieren von CREATE TABLE
Aussage unserer Tabelle.
So:
SHOW CREATE TABLE Pets;
Ergebnis:
+-------+------------------------------+ | Table | Create Table | +-------+------------------------------+ | Pets | CREATE TABLE `Pets` ( `PetId` int(11) NOT NULL, `PetTypeId` int(11) NOT NULL, `OwnerId` int(11) NOT NULL, `PetName` varchar(60) NOT NULL, `DOB` date DEFAULT NULL, PRIMARY KEY (`PetId`), KEY `PetTypeId` (`PetTypeId`), KEY `OwnerId` (`OwnerId`), CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`PetTypeId`) REFERENCES `PetTypes` (`PetTypeId`), CONSTRAINT `pets_ibfk_2` FOREIGN KEY (`OwnerId`) REFERENCES `Owners` (`OwnerId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+-------------------------------+
Der Zeichensatz und die Sortierungsinformationen werden jedoch nur zurückgegeben, wenn sie sich von der Standardsortierung der Tabelle unterscheiden. In diesem Beispiel waren die Sortierungsinformationen nicht abweichen, daher wurden keine Kollationsinformationen zurückgegeben.
Lassen Sie uns die Sortierung ändern:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
Und führen Sie SHOW CREATE TABLE
aus nochmal:
SHOW CREATE TABLE Pets;
Ergebnis:
+-------+------------------------------+ | Table | Create Table | +-------+------------------------------+ | Pets | CREATE TABLE `Pets` ( `PetId` int(11) NOT NULL, `PetTypeId` int(11) NOT NULL, `OwnerId` int(11) NOT NULL, `PetName` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL, `DOB` date DEFAULT NULL, PRIMARY KEY (`PetId`), KEY `PetTypeId` (`PetTypeId`), KEY `OwnerId` (`OwnerId`), CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`PetTypeId`) REFERENCES `PetTypes` (`PetTypeId`), CONSTRAINT `pets_ibfk_2` FOREIGN KEY (`OwnerId`) REFERENCES `Owners` (`OwnerId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+-------------------------------+
Dieses Mal können wir den neuen Zeichensatz und die Sortierungseinstellungen für PetName
sehen Spalte.