I MariaDB kan sortering anvendes på mange niveauer. Sortering kan anvendes på serverniveau, forbindelsesniveau, databaseniveau, tabelniveau og endda på kolonneniveau.
Det er også muligt at angive en sortering på forespørgselsniveau, så den vil tilsidesætte enhver sortering, der er blevet anvendt på database-, tabel- eller kolonneniveauer.
MariaDB giver en række muligheder for at returnere sorteringen på de forskellige niveauer.
Vis forbindelse, server og databasesortering
Vi kan bruge SHOW VARIABLES
administrativ erklæring med LIKE
klausul for at returnere variabler, der inkluderer en bestemt streng i deres navne.
Eksempel:
SHOW VARIABLES LIKE 'collation%';
Eksempelresultat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Det er de resultater, jeg får i mit testmiljø. Det resultat, du får, afhænger af dine indstillinger.
Hver af disse separate variabler kan returneres separat, hvis det kræves (se nedenfor).
Som standard er SHOW VARIABLES
viser SESSION
variabler. I dette tilfælde returnerer den de værdier, der er gældende for den aktuelle forbindelse.
Derfor kunne det foregående eksempel omskrives som følger:
SHOW SESSION VARIABLES LIKE 'collation%';
Eksempelresultat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Alternativt kan du erstatte SESSION
med LOCAL
(som er et synonym for SESSION
):
SHOW LOCAL VARIABLES LIKE 'collation%';
Du kan også bruge GLOBAL
modifikator for at vise de værdier, der bruges til nye forbindelser til MariaDB.
Eksempel:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Eksempelresultat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Serverindsamling
Følgende kommando returnerer serverens standardsortering:
SELECT @@collation_server;
Eksempelresultat:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Sortering på forbindelsesniveau
Når du kører en forespørgsel mod en MariaDB-database, bruger MariaDB en masse systemvariabler til at bestemme, hvilket tegnsæt og sortering, der skal bruges, når der køres forespørgsler. Hvis klienten bruger et andet tegnsæt til serveren, kan MariaDB oversætte det til et passende tegnsæt og sortering.
Når forespørgselsresultaterne sendes tilbage til klienten, kan MariaDB om nødvendigt oversætte disse resultater tilbage til et helt andet tegnsæt. MariaDB bruger systemvariable til at bestemme, hvilke tegnsæt og sorteringer der skal bruges ved hvert af disse trin.
Følgende fremhæver forbindelsessorteringen (du kan bruge den samme syntaks for enhver af systemvariablerne):
SELECT @@collation_connection;
Eksempelresultat:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
Du kan også returnere alle tegnsætsystemvariabler med følgende forespørgsel:
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å databaseniveau
Følgende sætning kan bruges til at kontrollere sammenstillingen af en given database:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Eksempelresultat:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
En anden måde at gøre det på er at bruge et udsagn som dette:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Eksempelresultat:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
Ved at bruge denne anden metode kan du få resultaterne uden at skifte database.
Her bruger den en anden database:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Eksempelresultat:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Dette er testdatabasen, der blev oprettet, da jeg først installerede MariaDB.
Sortering på tabelniveau
Følgende udsagn returnerer et antal kolonner, der giver information om en eller flere matchende tabeller. En af disse kolonner kaldes Samling , og det giver sammenstillingen af alle matchende tabeller.
SHOW TABLE STATUS LIKE '%Pets%';
Eksempelresultat (ved brug af lodret output):
*************************** 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 dette tilfælde fik jeg information om en tabel kaldet Pets
. Vi kan se, at Collation
kolonne indeholder utf8mb4_general_ci
, som er sammenstillingen af tabellen.
Denne erklæring accepterer også andre klausuler, såsom FROM
, WHERE
og IN
, så dette giver dig nogle muligheder, når du bygger din erklæring.
En anden måde at få sorteringsoplysninger om dine tabeller på er at køre en forespørgsel mod information_schema.tables
:
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Eksempelresultat:
+--------------+---------------+--------------------+ | 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å kolonneniveau
Kørsel af følgende forespørgsel returnerer oplysninger om hver kolonne i Pets
bord. Dette inkluderer sorteringsoplysningerne.
SHOW FULL COLUMNS FROM Pets;
Eksempelresultat:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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 forespørge information_schema.columns
. I dette tilfælde kan vi kun vælge de kolonner, vi er interesserede i:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Eksempelresultat:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
Og en anden mulighed, vi har i vores værktøjssæt, er at tjekke CREATE TABLE
opgørelse af vores tabel.
Sådan:
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 | +-------+-------------------------------+
Tegnsættet og sorteringsoplysningerne returneres dog kun, hvis de adskiller sig fra tabellens standardsortering. I dette eksempel gjorde sorteringsoplysningerne ikke afvige, og der blev derfor ikke returneret nogen sorteringsoplysninger.
Lad os ændre sammenstillingen:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
Og 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 | +-------+-------------------------------+
Denne gang kan vi se det nye tegnsæt og sorteringsindstillinger mod PetName
kolonne.