В MariaDB съпоставянето може да се прилага на много нива. Съпоставянето може да се приложи на ниво сървър, на ниво връзка, на ниво база данни, на ниво таблица и дори на ниво колона.
Възможно е също така да посочите съпоставяне на ниво заявка, така че да отмени всяко съпоставяне, което е приложено на ниво база данни, таблица или колона.
MariaDB предоставя редица опции за връщане на съпоставянето на различните нива.
Показване на съпоставянето на връзката, сървъра и базата данни
Можем да използваме SHOW VARIABLES
административно изявление с LIKE
клауза за връщане на променливи, които включват определен низ в техните имена.
Пример:
SHOW VARIABLES LIKE 'collation%';
Примерен резултат:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Това са резултатите, които получавам в моята тестова среда. Резултатът, който ще получите, ще зависи от вашите настройки.
Всяка от тези отделни променливи може да бъде върната отделно, ако е необходимо (вижте по-долу).
По подразбиране SHOW VARIABLES
показва SESSION
променливи. В този случай той връща стойностите, които са в сила за текущата връзка.
Следователно предишният пример може да бъде пренаписан, както следва:
SHOW SESSION VARIABLES LIKE 'collation%';
Примерен резултат:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Като алтернатива можете да замените SESSION
с LOCAL
(което е синоним на SESSION
):
SHOW LOCAL VARIABLES LIKE 'collation%';
Можете също да използвате GLOBAL
модификатор за показване на стойностите, които се използват за нови връзки към MariaDB.
Пример:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Примерен резултат:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Съпоставяне на сървъра
Следната команда връща съпоставянето по подразбиране на сървъра:
SELECT @@collation_server;
Примерен резултат:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Сравниване на ниво връзка
Когато изпълнявате заявка към база данни на MariaDB, MariaDB използва куп системни променливи, за да определи кой набор от знаци и съпоставяне да използва при изпълнение на заявки. Ако клиентът използва различен набор от знаци за сървъра, тогава MariaDB може да го преведе в подходящ набор от знаци и съпоставяне.
Когато изпраща резултатите от заявката обратно на клиента, MariaDB може да преведе тези резултати обратно в различен набор от символи, ако е необходимо. MariaDB използва системни променливи, за да определи кои набори от знаци и съпоставяне да използва при всяка от тези стъпки.
Следното отделя съпоставянето на връзката (можете да използвате същия синтаксис за всяка от системните променливи):
SELECT @@collation_connection;
Примерен резултат:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
Можете също да върнете всички системни променливи на набора от знаци със следната заявка:
SHOW VARIABLES LIKE 'character_set%';
Резултат:
+--------------------------+--------------------------------------------------------+ | 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/ | +--------------------------+--------------------------------------------------------+
Сравняване на ниво база данни
Следният израз може да се използва за проверка на съпоставянето на дадена база данни:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Примерен резултат:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Друг начин да го направите е да използвате изявление като това:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Примерен резултат:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
Използването на този втори метод ви позволява да получите резултатите, без да превключвате базата данни.
Тук той използва различна база данни:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Примерен резултат:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Това е тестовата база данни, която беше създадена, когато за първи път инсталирах MariaDB.
Сравняване на ниво таблица
Следващият оператор връща редица колони, които предоставят информация за всяка съответстваща таблица/и. Една от тези колони се нарича Сравняване и осигурява съпоставяне на всички съвпадащи таблици.
SHOW TABLE STATUS LIKE '%Pets%';
Примерен резултат (с помощта на вертикален изход):
*************************** 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
В този случай получих информация за таблица, наречена Pets
. Можем да видим, че Collation
колоната съдържа utf8mb4_general_ci
, което е съпоставянето на таблицата.
Това изявление приема и други клаузи, като FROM
, WHERE
и IN
, така че това ви дава някои опции при изграждането на вашето изявление.
Друг начин да получите информация за съпоставяне за вашите таблици е да изпълните заявка срещу information_schema.tables
:
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Примерен резултат:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Сравняване на ниво колона
Изпълнението на следната заявка връща информация за всяка колона в Pets
маса. Това включва информацията за съпоставяне.
SHOW FULL COLUMNS FROM Pets;
Примерен резултат:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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 | | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
Като алтернатива можем да потърсим information_schema.columns
. В този случай можем да изберем само колоните, които ни интересуват:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Примерен резултат:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
И друга опция, която имаме в нашия инструментариум, е да проверим CREATE TABLE
изявление на нашата маса.
Като това:
SHOW CREATE TABLE Pets;
Резултат:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Въпреки това, наборът от знаци и информацията за съпоставяне се връщат само ако се различават от съпоставянето по подразбиране на таблицата. В този пример информацията за съпоставяне не се различават и така не бе върната информация за съпоставяне.
Нека променим съпоставянето:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
И стартирайте SHOW CREATE TABLE
отново:
SHOW CREATE TABLE Pets;
Резултат:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Този път можем да видим новия набор от знаци и настройки за съпоставяне срещу PetName
колона.