I MariaDB kan sortering användas på många nivåer. Sortering kan tillämpas på servernivå, anslutningsnivå, databasnivå, tabellnivå och till och med på kolumnnivå.
Det är också möjligt att ange en sortering på frågenivå, så att den kommer att åsidosätta all sortering som har tillämpats på databas-, tabell- eller kolumnnivåer.
MariaDB tillhandahåller ett antal alternativ för att returnera sorteringen på olika nivåer.
Visa anslutning, server och databassortering
Vi kan använda VISA VARIABLER
administrativt uttalande med LIKE
sats för att returnera variabler som inkluderar en viss sträng i sina namn.
Exempel:
SHOW VARIABLES LIKE 'collation%';
Exempelresultat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Det här är resultaten som jag får i min testmiljö. Resultatet du får beror på dina inställningar.
Var och en av dessa separata variabler kan returneras separat vid behov (se nedan).
Som standard är VISA VARIABLER
visar SESSION
variabler. I det här fallet returnerar den de värden som gäller för den aktuella anslutningen.
Därför skulle det föregående exemplet kunna skrivas om enligt följande:
SHOW SESSION VARIABLES LIKE 'collation%';
Exempelresultat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Alternativt kan du ersätta SESSION
med LOCAL
(som är en synonym för SESSION
):
SHOW LOCAL VARIABLES LIKE 'collation%';
Du kan också använda GLOBAL
modifierare för att visa värdena som används för nya anslutningar till MariaDB.
Exempel:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Exempelresultat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Serversamling
Följande kommando returnerar serverns standardsortering:
SELECT @@collation_server;
Exempelresultat:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Sortering på anslutningsnivå
När du kör en fråga mot en MariaDB-databas använder MariaDB ett gäng systemvariabler för att avgöra vilken teckenuppsättning och sortering som ska användas när frågor körs. Om klienten använder en annan teckenuppsättning än servern kan MariaDB översätta den till en lämplig teckenuppsättning och sortering.
När du skickar frågeresultaten tillbaka till klienten kan MariaDB översätta dessa resultat tillbaka till en annan teckenuppsättning helt och hållet om det behövs. MariaDB använder systemvariabler för att bestämma vilka teckenuppsättningar och sammanställningar som ska användas vid vart och ett av dessa steg.
Följande pekar ut anslutningssorteringen (du kan använda samma syntax för vilken som helst av systemvariablerna):
SELECT @@collation_connection;
Exempelresultat:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
Du kan också returnera alla teckenuppsättningssystemvariabler med följande fråga:
SHOW VARIABLES LIKE 'character_set%';
Resultat:
+--------------------------+--------------------------------------------------------+ | 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/ | +--------------------------+--------------------------------------------------------+
Sortering på databasnivå
Följande sats kan användas för att kontrollera sammanställningen av en given databas:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Exempelresultat:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Ett annat sätt att göra det är att använda ett påstående som detta:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Exempelresultat:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
Genom att använda denna andra metod kan du få resultaten utan att byta databas.
Här använder den en annan databas:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Exempelresultat:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Det här är testdatabasen som skapades när jag först installerade MariaDB.
Sortering på tabellnivå
Följande sats returnerar ett antal kolumner som ger information om alla matchande tabeller. En av dessa kolumner kallas Sortering , och det tillhandahåller sammanställning av alla matchande tabeller.
SHOW TABLE STATUS LIKE '%Pets%';
Exempelresultat (med vertikal utdata):
*************************** 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
I det här fallet fick jag information om en tabell som heter Husdjur
. Vi kan se att Sorteringen
kolumnen innehåller utf8mb4_general_ci
, som är sammanställningen av tabellen.
Detta uttalande accepterar även andra satser, såsom FROM
, VAR
och IN
, så detta ger dig några alternativ när du bygger ditt uttalande.
Ett annat sätt att få sorteringsinformation om dina tabeller är att köra en fråga mot information_schema.tables
:
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Exempelresultat:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Sortering på kolumnnivå
Att köra följande fråga returnerar information om varje kolumn i Husdjur
tabell. Detta inkluderar sorteringsinformationen.
SHOW FULL COLUMNS FROM Pets;
Exempelresultat:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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 | | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
Alternativt kan vi fråga information_schema.columns
. I det här fallet kan vi välja bara de kolumner vi är intresserade av:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Exempelresultat:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
Och ett annat alternativ vi har i vår verktygslåda är att kolla in CREATE TABLE
redogörelse för vårt bord.
Så här:
SHOW CREATE TABLE Pets;
Resultat:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Teckenuppsättningen och sorteringsinformationen returneras dock endast om de skiljer sig från tabellens standardsortering. I det här exemplet gjorde sorteringsinformationen inte skiljer sig, och därför returnerades ingen sorteringsinformation.
Låt oss ändra sorteringen:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
Och kör SHOW CREATE TABLE
igen:
SHOW CREATE TABLE Pets;
Resultat:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Den här gången kan vi se den nya teckenuppsättningen och sorteringsinställningarna mot