In MariaDB, le regole di confronto possono essere applicate a molti livelli. Le regole di confronto possono essere applicate a livello di server, di connessione, di database, di tabella e persino a livello di colonna.
È anche possibile specificare un confronto a livello di query, in modo che sostituisca qualsiasi confronto applicato a livello di database, tabella o colonna.
MariaDB fornisce una serie di opzioni per la restituzione delle regole di confronto ai vari livelli.
Mostra la connessione, il server e il database di confronto
Possiamo usare SHOW VARIABLES
dichiarazione amministrativa con il LIKE
clausola per restituire variabili che includono una determinata stringa all'interno dei loro nomi.
Esempio:
SHOW VARIABLES LIKE 'collation%';
Esempio di risultato:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Questi sono i risultati che ottengo nel mio ambiente di test. Il risultato che otterrai dipenderà dalle tue impostazioni.
Ognuna di queste variabili separate può essere restituita separatamente, se necessario (vedi sotto).
Per impostazione predefinita, SHOW VARIABLES
mostra la SESSION
variabili. In questo caso, restituisce i valori in vigore per la connessione corrente.
Pertanto, l'esempio precedente potrebbe essere riscritto come segue:
SHOW SESSION VARIABLES LIKE 'collation%';
Esempio di risultato:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
In alternativa, puoi sostituire SESSION
con LOCAL
(che è sinonimo di SESSION
):
SHOW LOCAL VARIABLES LIKE 'collation%';
Puoi anche usare il GLOBAL
modificatore per visualizzare i valori utilizzati per le nuove connessioni a MariaDB.
Esempio:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Esempio di risultato:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Confronto server
Il comando seguente restituisce le regole di confronto predefinite del server:
SELECT @@collation_server;
Esempio di risultato:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Confronto a livello di connessione
Quando si esegue una query su un database MariaDB, MariaDB 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, MariaDB può tradurlo in un set di caratteri e regole di confronto appropriati.
Quando si inviano i risultati della query al client, MariaDB può tradurre questi risultati in un set di caratteri completamente diverso, se necessario. MariaDB 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 | +------------------------+ | utf8_general_ci | +------------------------+
Puoi anche restituire tutte le variabili di sistema del set di caratteri con la seguente query:
SHOW VARIABLES LIKE 'character_set%';
Risultato:
+--------------------------+--------------------------------------------------------+ | 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/ | +--------------------------+--------------------------------------------------------+
Confronto a livello di database
La seguente istruzione può essere utilizzata per verificare le regole di confronto di un determinato database:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Esempio di risultato:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Un altro modo per farlo è usare un'istruzione come questa:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Esempio di risultato:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
L'utilizzo di questo secondo metodo consente di ottenere i risultati senza cambiare il database.
Qui sta usando un database diverso:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Esempio di risultato:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Questo è il database di test che è stato creato quando ho installato MariaDB per la prima volta.
Fascicolazione a livello di tabella
L'istruzione seguente restituisce un numero 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 '%Pets%';
Esempio di risultato (usando l'output verticale):
*************************** 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 questo caso, ho ricevuto informazioni su un tavolo chiamato Pets
. Possiamo vedere che il Collation
la colonna contiene utf8mb4_general_ci
, che è il confronto della tabella.
Questa dichiarazione accetta anche altre clausole, come FROM
, WHERE
e IN
, quindi questo ti offre alcune opzioni durante la creazione della tua dichiarazione.
Un altro modo per ottenere informazioni sulle regole di confronto sulle tabelle è eseguire una query su information_schema.tables
:
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Esempio di risultato:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Fascicolazione a livello di colonna
L'esecuzione della query seguente restituisce informazioni su ciascuna colonna in Pets
tavolo. Ciò include le informazioni sulla raccolta.
SHOW FULL COLUMNS FROM Pets;
Esempio di risultato:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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 | | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
In alternativa, possiamo interrogare information_schema.columns
. In questo caso, possiamo scegliere solo le colonne che ci interessano:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Esempio di risultato:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
E un'altra opzione che abbiamo nel nostro toolkit è controllare il CREATE TABLE
dichiarazione della nostra tavola.
In questo modo:
SHOW CREATE TABLE Pets;
Risultato:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
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, le informazioni sulla raccolta non differiscono e quindi non è stata restituita alcuna informazione di confronto.
Cambiamo le regole di confronto:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
Ed esegui SHOW CREATE TABLE
ancora:
SHOW CREATE TABLE Pets;
Risultato:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Questa volta possiamo vedere il nuovo set di caratteri e le impostazioni di confronto rispetto a PetName
colonna.