In MySQL, le regole di confronto possono essere applicate a molti livelli. Può essere applicato a livello di server, a livello di connessione, a livello di database, a livello di tabella e persino a livello di colonna. Puoi anche specificare un confronto nelle tue query che sostituirà qualsiasi confronto che è stato applicato a livello di database, tabella o colonna.
Ecco come scoprire quali regole di confronto vengono applicate a ciascuno di questi livelli.
Collegamento per connessione, server e database
Il modo più rapido per ottenere informazioni sulle regole di confronto per la connessione, il server e il database è utilizzare la seguente istruzione. Questa istruzione restituisce tutte le variabili di sistema che iniziano con collation
:
SHOW VARIABLES LIKE 'collation%';
Ciò restituisce le regole di confronto per il server, la connessione e il database. In questo modo:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_0900_ai_ci | | collation_database | utf8_general_ci | | collation_server | utf8mb4_0900_ai_ci | +----------------------+--------------------+
È inoltre possibile restituire ciascuna di queste variabili di sistema separatamente, se necessario. Vedi sotto per le istruzioni su come farlo.
Confronto a livello di server
L'esecuzione del comando seguente restituisce le regole di confronto predefinite del server.
SELECT @@collation_server;
Esempio di risultato:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_0900_ai_ci | +--------------------+
Confronto a livello di connessione
Quando si esegue una query su un database MySQL, MySQL utilizza una serie di variabili di sistema per determinare quale set di caratteri e regole di confronto utilizzare ogni volta che vengono eseguite le query. Se il client utilizza un set di caratteri diverso dal server, MySQL può tradurlo in un set di caratteri e regole di confronto appropriati.
Quando invia i risultati della query al client, MySQL può tradurre questi risultati in un set di caratteri completamente diverso, se necessario. MySQL utilizza le variabili di sistema per determinare quali set di caratteri e regole di confronto utilizzare in ciascuno di questi passaggi.
Quanto segue individua le regole di confronto delle connessioni (puoi usare la stessa sintassi per qualsiasi variabile di sistema):
SELECT @@collation_connection;
Esempio di risultato:
+------------------------+ | @@collation_connection | +------------------------+ | utf8mb4_0900_ai_ci | +------------------------+
Puoi anche restituire tutte le variabili di sistema del set di caratteri con la seguente query:
SHOW VARIABLES LIKE 'character_set%';
Esempio di risultato:
+--------------------------+----------------------------------+ | 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/ | +--------------------------+----------------------------------+
Confronto a livello di database
La seguente istruzione può essere utilizzata per verificare le regole di confronto di un determinato database:
USE Music; SELECT @@character_set_database, @@collation_database;
Esempio di risultato:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8 | utf8_general_ci | +--------------------------+----------------------+
In alternativa, puoi utilizzare la seguente istruzione (che elimina la necessità di modificare il database predefinito):
SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name = 'Music';
Esempio di risultato:
+----------------------------+------------------------+ | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +----------------------------+------------------------+ | utf8 | utf8_general_ci | +----------------------------+------------------------+
Fascicolazione a livello di tabella
L'esecuzione della seguente istruzione restituirà un intero gruppo di colonne che forniscono informazioni su eventuali tabelle corrispondenti. Una di queste colonne è denominata Fascicolazione e fornisce le regole di confronto di tutte le tabelle corrispondenti.
SHOW TABLE STATUS LIKE '%Artists%';
Ovviamente dovrai sostituire %Artists%
con il tuo nome di tabella. E puoi omettere i segni di percentuale se non pensi che siano necessari. Questa dichiarazione accetta anche altre clausole, come FROM
, WHERE
e IN
, quindi questo ti offre alcune opzioni durante la creazione della tua dichiarazione.
Un problema con l'istruzione precedente è che restituisce molte colonne e potresti essere costretto a scorrere lateralmente per trovare la colonna di confronto. Se sei interessato solo alle informazioni di confronto, puoi eseguire una query su information_schema.tables
. Se necessario, puoi anche restituire le regole di confronto per tutte le tabelle all'interno di un determinato database. Ecco come farlo:
SELECT table_schema, table_name, table_collation FROM information_schema.tables WHERE table_schema = 'Music';
Esempio di risultati:
+--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | Music | Albums | utf8_general_ci | | Music | Artists | utf8_general_ci | | Music | Genres | utf8_general_ci | +--------------+------------+-----------------+
Fascicolazione a livello di colonna
L'esecuzione della query seguente restituisce informazioni su ciascuna colonna in una determinata tabella. Ciò include le informazioni sulla raccolta.
SHOW FULL COLUMNS FROM Artists;
Ciò comporta la restituzione di molte colonne con tutti i tipi di informazioni sulla colonna, incluse le regole di confronto.
Puoi ridurre il numero di colonne restituite in questo modo:
SELECT column_name, character_set_name, collation_name FROM information_schema.columns WHERE table_name = 'Artists';
Esempio di risultato:
+-------------+--------------------+-----------------+ | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME | +-------------+--------------------+-----------------+ | ArtistId | NULL | NULL | | ArtistName | utf8 | utf8_spanish_ci | | ActiveFrom | NULL | NULL | +-------------+--------------------+-----------------+
Puoi anche eseguire SHOW CREATE TABLE
istruzione per visualizzare una definizione della tabella (che include le sue colonne).
SHOW CREATE TABLE Artists;
Questo restituisce qualcosa del genere:
+---------+--------------------------------+ | 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 | +---------+--------------------------------+
Tuttavia, le informazioni sul set di caratteri e sulle regole di confronto vengono restituite solo se differiscono dalle regole di confronto predefinite della tabella. In questo esempio, ho impostato esplicitamente ArtistName
colonna a un confronto diverso solo a scopo dimostrativo (altrimenti le informazioni sulla confronto non sarebbero state restituite).