In MariaDB kan sortering op veel niveaus worden toegepast. Sortering kan worden toegepast op serverniveau, verbindingsniveau, databaseniveau, tabelniveau en zelfs op kolomniveau.
Het is ook mogelijk om een sortering op queryniveau op te geven, zodat deze elke sortering die op database-, tabel- of kolomniveau is toegepast, overschrijft.
MariaDB biedt een aantal opties voor het retourneren van de sortering op de verschillende niveaus.
Toon de verbinding, server en databasesortering
We kunnen de SHOW VARIABLES
. gebruiken administratieve verklaring met de LIKE
clausule om variabelen te retourneren die een bepaalde tekenreeks in hun naam bevatten.
Voorbeeld:
SHOW VARIABLES LIKE 'collation%';
Voorbeeld resultaat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Dit zijn de resultaten die ik krijg in mijn testomgeving. Het resultaat dat u krijgt, hangt af van uw instellingen.
Elk van deze afzonderlijke variabelen kan indien nodig afzonderlijk worden geretourneerd (zie hieronder).
Standaard SHOW VARIABLES
toont de SESSION
variabelen. In dit geval worden de waarden geretourneerd die van kracht zijn voor de huidige verbinding.
Daarom zou het vorige voorbeeld als volgt kunnen worden herschreven:
SHOW SESSION VARIABLES LIKE 'collation%';
Voorbeeld resultaat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Als alternatief kunt u SESSION
. vervangen met LOCAL
(wat een synoniem is voor SESSION
):
SHOW LOCAL VARIABLES LIKE 'collation%';
U kunt ook de GLOBAL
. gebruiken modifier om de waarden weer te geven die worden gebruikt voor nieuwe verbindingen met MariaDB.
Voorbeeld:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Voorbeeld resultaat:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Serversortering
De volgende opdracht retourneert de standaardsortering van de server:
SELECT @@collation_server;
Voorbeeld resultaat:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Collatie op verbindingsniveau
Wanneer u een query uitvoert op een MariaDB-database, gebruikt MariaDB een aantal systeemvariabelen om te bepalen welke tekenset en sortering moet worden gebruikt wanneer query's worden uitgevoerd. Als de client een andere tekenset dan de server gebruikt, kan MariaDB deze vertalen naar een geschikte tekenset en sortering.
Bij het terugsturen van de queryresultaten naar de client, kan MariaDB deze resultaten desgewenst terugvertalen naar een andere tekenset. MariaDB gebruikt systeemvariabelen om te bepalen welke tekensets en sorteringen bij elk van deze stappen moeten worden gebruikt.
Het volgende onderscheidt de verbindingssortering (u kunt dezelfde syntaxis gebruiken voor elk van de systeemvariabelen):
SELECT @@collation_connection;
Voorbeeld resultaat:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
U kunt ook alle systeemvariabelen van de tekenset retourneren met de volgende vraag:
SHOW VARIABLES LIKE 'character_set%';
Resultaat:
+--------------------------+--------------------------------------------------------+ | 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/ | +--------------------------+--------------------------------------------------------+
Sorteren op databaseniveau
De volgende verklaring kan worden gebruikt om de sortering van een bepaalde database te controleren:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Voorbeeld resultaat:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Een andere manier om dit te doen, is om een verklaring als deze te gebruiken:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Voorbeeld resultaat:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
Door deze tweede methode te gebruiken, kunt u de resultaten krijgen zonder van database te wisselen.
Hier gebruikt het een andere database:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Voorbeeld resultaat:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Dit is de testdatabase die is gemaakt toen ik MariaDB voor het eerst installeerde.
Sorteren op tabelniveau
De volgende instructie retourneert een aantal kolommen die informatie geven over eventuele overeenkomende tabellen. Een van deze kolommen heet Collatie , en het biedt de verzameling van alle overeenkomende tabellen.
SHOW TABLE STATUS LIKE '%Pets%';
Voorbeeldresultaat (met verticale uitvoer):
*************************** 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 dit geval kreeg ik informatie over een tafel genaamd Pets
. We kunnen zien dat de Collation
kolom bevat utf8mb4_general_ci
, wat de verzameling van de tabel is.
Deze verklaring accepteert ook andere clausules, zoals FROM
, WHERE
, en IN
, dus dit geeft je een aantal opties bij het samenstellen van je verklaring.
Een andere manier om informatie over uw tabellen te verzamelen, is door een query uit te voeren op information_schema.tables
:
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Voorbeeld resultaat:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Sorteren op kolomniveau
Als u de volgende zoekopdracht uitvoert, wordt informatie geretourneerd over elke kolom in de Pets
tafel. Dit omvat de sorteerinformatie.
SHOW FULL COLUMNS FROM Pets;
Voorbeeld resultaat:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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 | | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
Als alternatief kunnen we information_schema.columns
. opvragen . In dit geval kunnen we alleen de kolommen kiezen waarin we geïnteresseerd zijn:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Voorbeeld resultaat:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
En een andere optie die we in onze toolkit hebben, is om de CREATE TABLE
te bekijken verklaring van onze tafel.
Zoals dit:
SHOW CREATE TABLE Pets;
Resultaat:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
De tekenset en sorteergegevens worden echter alleen geretourneerd als ze verschillen van de standaardsortering van de tabel. In dit voorbeeld deed de sorteerinformatie niet verschillen, en er is dus geen sorteerinformatie geretourneerd.
Laten we de sortering wijzigen:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
En voer SHOW CREATE TABLE
. uit nogmaals:
SHOW CREATE TABLE Pets;
Resultaat:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Deze keer kunnen we de nieuwe tekenset en sorteerinstellingen zien tegen de PetName
kolom.