I MySQL kan sortering anvendes på mange niveauer. Det kan anvendes på serverniveau, forbindelsesniveau, databaseniveau, tabelniveau og endda på kolonneniveau. Du kan også angive en sortering i dine forespørgsler, der vil tilsidesætte enhver sortering, der er blevet anvendt på database-, tabel- eller kolonneniveauer.
Sådan finder du ud af, hvilken sortering der anvendes på hvert af disse niveauer.
Genvej til forbindelse, server og databasesamling
Den hurtigste måde at få sorteringsoplysninger for forbindelsen, serveren og databasen er at bruge følgende erklæring. Denne sætning returnerer alle systemvariabler, der starter med collation
:
SHOW VARIABLES LIKE 'collation%';
Dette returnerer sorteringen for serveren, forbindelsen og databasen. Sådan:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_0900_ai_ci | | collation_database | utf8_general_ci | | collation_server | utf8mb4_0900_ai_ci | +----------------------+--------------------+
Du kan også returnere hver af disse systemvariable separat, hvis det kræves. Se nedenfor for instruktioner om, hvordan du gør det.
Sortering på serverniveau
Kørsel af følgende kommando returnerer serverens standardsortering.
SELECT @@collation_server;
Eksempelresultat:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_0900_ai_ci | +--------------------+
Sortering på forbindelsesniveau
Når du kører en forespørgsel mod en MySQL-database, bruger MySQL 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 end serveren, kan MySQL oversætte det til et passende tegnsæt og sortering.
Når forespørgselsresultaterne sendes tilbage til klienten, kan MySQL om nødvendigt oversætte disse resultater tilbage til et helt andet tegnsæt. MySQL bruger systemvariabler til at bestemme, hvilke tegnsæt og kollationer 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 | +------------------------+ | utf8mb4_0900_ai_ci | +------------------------+
Du kan også returnere alle tegnsætsystemvariabler med følgende forespørgsel:
SHOW VARIABLES LIKE 'character_set%';
Eksempelresultat:
+--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+
Sortering på databaseniveau
Følgende sætning kan bruges til at kontrollere sammenstillingen af en given database:
USE Music; SELECT @@character_set_database, @@collation_database;
Eksempelresultat:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8 | utf8_general_ci | +--------------------------+----------------------+
Alternativt kan du bruge følgende sætning (hvilket eliminerer behovet for at ændre standarddatabasen):
SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name = 'Music';
Eksempelresultat:
+----------------------------+------------------------+ | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +----------------------------+------------------------+ | utf8 | utf8_general_ci | +----------------------------+------------------------+
Sortering på tabelniveau
Kørsel af følgende sætning vil returnere en hel masse kolonner, der giver information om enhver matchende tabel/er. En af disse kolonner kaldes Samling , og det giver sammenstillingen af alle matchende tabeller.
SHOW TABLE STATUS LIKE '%Artists%';
Selvfølgelig skal du erstatte %Artists%
med dit eget bordnavn. Og du kan udelade procenttegnene, hvis du ikke synes, de er nødvendige. 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.
Et problem med den tidligere sætning er, at den returnerer mange kolonner, og du kan blive tvunget til at rulle sidelæns for at finde sorteringskolonnen. Hvis du kun er interesseret i sorteringsoplysningerne, kan du forespørge information_schema.tables
. Du kan også returnere sorteringen for alle tabeller i en given database, hvis det kræves. Sådan gør du det:
SELECT table_schema, table_name, table_collation FROM information_schema.tables WHERE table_schema = 'Music';
Eksempelresultater:
+--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | Music | Albums | utf8_general_ci | | Music | Artists | utf8_general_ci | | Music | Genres | utf8_general_ci | +--------------+------------+-----------------+
Sortering på kolonneniveau
Kørsel af følgende forespørgsel returnerer oplysninger om hver kolonne i en given tabel. Dette inkluderer sorteringsoplysningerne.
SHOW FULL COLUMNS FROM Artists;
Det resulterer i, at mange kolonner bliver returneret med alle mulige oplysninger om kolonnen, inklusive sorteringen.
Du kan reducere antallet af returnerede kolonner ved at gøre dette:
SELECT column_name, character_set_name, collation_name FROM information_schema.columns WHERE table_name = 'Artists';
Eksempelresultat:
+-------------+--------------------+-----------------+ | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME | +-------------+--------------------+-----------------+ | ArtistId | NULL | NULL | | ArtistName | utf8 | utf8_spanish_ci | | ActiveFrom | NULL | NULL | +-------------+--------------------+-----------------+
Du kan også køre SHOW CREATE TABLE
sætning for at vise en definition af tabellen (som inkluderer dens kolonner).
SHOW CREATE TABLE Artists;
Dette returnerer noget som dette:
+---------+--------------------------------+ | Table | Create Table | +---------+--------------------------------+ | Artists | CREATE TABLE `Artists` ( `ArtistId` int(11) NOT NULL AUTO_INCREMENT, `ArtistName` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL, `ActiveFrom` datetime NOT NULL, PRIMARY KEY (`ArtistId`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 | +---------+--------------------------------+
Tegnsættet og sorteringsoplysningerne returneres dog kun, hvis de adskiller sig fra tabellens standardsortering. I dette eksempel indstillede jeg eksplicit ArtistName
kolonne til en anden sortering kun til demonstrationsformål (ellers ville sorteringsoplysningerne ikke være blevet returneret).