sql >> Database >  >> RDS >> Mysql

Hoe de sortering in MySQL te vinden

In MySQL kan collatie op vele niveaus worden toegepast. Het kan worden toegepast op serverniveau, verbindingsniveau, databaseniveau, tabelniveau en zelfs op kolomniveau. U kunt ook een sortering in uw zoekopdrachten opgeven die elke sortering die op database-, tabel- of kolomniveau is toegepast, overschrijft.

Hier leest u hoe u kunt zien welke sortering wordt toegepast op elk van deze niveaus.

Snelkoppeling voor verbinding, server en databasesortering

De snelste manier om sorteerinformatie voor de verbinding, server en database te krijgen, is door de volgende instructie te gebruiken. Deze instructie retourneert alle systeemvariabelen die beginnen met collation :

SHOW VARIABLES LIKE 'collation%';

Dit retourneert de sortering voor de server, verbinding en database. Zoals dit:

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database   | utf8_general_ci    |
| collation_server     | utf8mb4_0900_ai_ci |
+----------------------+--------------------+

Indien nodig kunt u elk van deze systeemvariabelen ook afzonderlijk retourneren. Zie hieronder voor instructies over hoe u dat kunt doen.

Sorteren op serverniveau

Als u de volgende opdracht uitvoert, wordt de standaardsortering van de server geretourneerd.

SELECT @@collation_server;

Voorbeeld resultaat:

+--------------------+
| @@collation_server |
+--------------------+
| utf8mb4_0900_ai_ci |
+--------------------+

Collatie op verbindingsniveau

Wanneer u een query uitvoert op een MySQL-database, gebruikt MySQL 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 MySQL deze vertalen in een geschikte tekenset en sortering.

Bij het terugsturen van de queryresultaten naar de client, kan MySQL deze resultaten desgewenst terugvertalen naar een andere tekenset. MySQL 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 |
+------------------------+
| utf8mb4_0900_ai_ci     |
+------------------------+

U kunt ook alle systeemvariabelen van de tekenset retourneren met de volgende vraag:

SHOW VARIABLES LIKE 'character_set%';

Voorbeeld resultaat:

+--------------------------+----------------------------------+
| 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/ |
+--------------------------+----------------------------------+

Sorteren op databaseniveau

De volgende verklaring kan worden gebruikt om de sortering van een bepaalde database te controleren:

USE Music;
SELECT @@character_set_database, @@collation_database;

Voorbeeld resultaat:

+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8                     | utf8_general_ci      |
+--------------------------+----------------------+

Als alternatief kunt u de volgende instructie gebruiken (waardoor de noodzaak om de standaarddatabase te wijzigen overbodig wordt):

SELECT 
   default_character_set_name, 
   default_collation_name
FROM information_schema.schemata 
WHERE schema_name = 'Music';

Voorbeeld resultaat:

+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8                       | utf8_general_ci        |
+----------------------------+------------------------+

Sorteren op tabelniveau

Als u de volgende instructie uitvoert, wordt een hele reeks kolommen geretourneerd die informatie geven over alle overeenkomende tabellen. Een van deze kolommen heet Collatie , en het biedt de verzameling van alle overeenkomende tabellen.

SHOW TABLE STATUS LIKE '%Artists%';

Natuurlijk moet je %Artists% . vervangen met uw eigen tafelnaam. En u kunt de percentagetekens weglaten als u denkt dat ze niet nodig zijn. 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 probleem met de vorige verklaring is dat deze veel kolommen retourneert en dat u wellicht zijwaarts moet scrollen om de sorteerkolom te vinden. Als u alleen geïnteresseerd bent in de sorteerinformatie, kunt u information_schema.tables opvragen . U kunt indien nodig ook de sortering voor alle tabellen in een bepaalde database retourneren. Zo doe je dat:

SELECT 
   table_schema,
   table_name,
   table_collation   
FROM information_schema.tables
WHERE table_schema = 'Music';

Voorbeeldresultaten:

+--------------+------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION |
+--------------+------------+-----------------+
| Music        | Albums     | utf8_general_ci |
| Music        | Artists    | utf8_general_ci |
| Music        | Genres     | utf8_general_ci |
+--------------+------------+-----------------+

Sorteren op kolomniveau

Als u de volgende query uitvoert, wordt informatie over elke kolom in een bepaalde tabel geretourneerd. Dit omvat de sorteerinformatie.

SHOW FULL COLUMNS FROM Artists;

Dat resulteert in veel kolommen die worden geretourneerd met allerlei informatie over de kolom, inclusief de sortering.

U kunt het aantal geretourneerde kolommen verminderen door dit te doen:

SELECT 
   column_name, 
   character_set_name, 
   collation_name 
FROM information_schema.columns 
WHERE table_name = 'Artists';

Voorbeeld resultaat:

+-------------+--------------------+-----------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME  |
+-------------+--------------------+-----------------+
| ArtistId    | NULL               | NULL            |
| ArtistName  | utf8               | utf8_spanish_ci |
| ActiveFrom  | NULL               | NULL            |
+-------------+--------------------+-----------------+

U kunt ook de SHOW CREATE TABLE . uitvoeren statement om een ​​definitie van de tabel weer te geven (inclusief de kolommen).

SHOW CREATE TABLE Artists;

Dit geeft zoiets als dit terug:

+---------+--------------------------------+
| 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 |
+---------+--------------------------------+

De tekenset en sorteergegevens worden echter alleen geretourneerd als ze verschillen van de standaardsortering van de tabel. In dit voorbeeld heb ik expliciet de ArtistName kolom naar een andere sortering alleen voor demonstratiedoeleinden (anders zou de sorteerinformatie niet zijn geretourneerd).


  1. Het herstelmodel van een SQL Server-database wijzigen met T-SQL

  2. MySQL:de lengte van tekst in een kolom krijgen

  3. MySQL WORDT alleen lid van de meest recente rij?

  4. MySQL-prestaties:lange zoekopdrachten identificeren