MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Zeigen Sie die Sortierung in MariaDB an

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.