Trong MariaDB, đối chiếu có thể được áp dụng ở nhiều cấp độ. Đối chiếu có thể được áp dụng ở cấp máy chủ, cấp kết nối, cấp cơ sở dữ liệu, cấp bảng và thậm chí ở cấp cột.
Cũng có thể chỉ định một đối chiếu ở cấp truy vấn để nó sẽ ghi đè mọi đối chiếu đã được áp dụng ở cấp cơ sở dữ liệu, bảng hoặc cột.
MariaDB cung cấp một số tùy chọn để trả lại đối chiếu ở các cấp độ khác nhau.
Hiển thị Kết nối, Máy chủ và Đối chiếu Cơ sở dữ liệu
Chúng ta có thể sử dụng SHOW VARIABLES
câu lệnh quản trị với LIKE
mệnh đề để trả về các biến bao gồm một chuỗi nhất định trong tên của chúng.
Ví dụ:
SHOW VARIABLES LIKE 'collation%';
Kết quả ví dụ:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Đây là những kết quả mà tôi nhận được trong môi trường thử nghiệm của mình. Kết quả bạn nhận được sẽ phụ thuộc vào cài đặt của bạn.
Mỗi biến trong số các biến riêng biệt này có thể được trả về riêng biệt nếu được yêu cầu (xem bên dưới).
Theo mặc định, SHOW VARIABLES
hiển thị SESSION
biến. Trong trường hợp này, nó trả về các giá trị có hiệu lực cho kết nối hiện tại.
Do đó, ví dụ trước có thể được viết lại như sau:
SHOW SESSION VARIABLES LIKE 'collation%';
Kết quả ví dụ:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Ngoài ra, bạn có thể thay thế SESSION
với LOCAL
(là từ đồng nghĩa với SESSION
):
SHOW LOCAL VARIABLES LIKE 'collation%';
Bạn cũng có thể sử dụng GLOBAL
sửa đổi để hiển thị các giá trị được sử dụng cho các kết nối mới với MariaDB.
Ví dụ:
SHOW GLOBAL VARIABLES LIKE 'collation%';
Kết quả ví dụ:
+----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +----------------------+--------------------+
Đối chiếu máy chủ
Lệnh sau trả về đối chiếu mặc định của máy chủ:
SELECT @@collation_server;
Kết quả ví dụ:
+--------------------+ | @@collation_server | +--------------------+ | utf8mb4_general_ci | +--------------------+
Đối chiếu cấp độ kết nối
Khi bạn chạy một truy vấn đối với cơ sở dữ liệu MariaDB, MariaDB sử dụng một loạt các biến hệ thống để xác định bộ ký tự và đối chiếu nào sẽ sử dụng bất cứ khi nào truy vấn được chạy. Nếu máy khách sử dụng bộ ký tự khác cho máy chủ, thì MariaDB có thể dịch nó thành bộ ký tự và đối chiếu thích hợp.
Khi gửi lại kết quả truy vấn cho máy khách, MariaDB có thể dịch hoàn toàn các kết quả này sang một bộ ký tự khác nếu được yêu cầu. MariaDB sử dụng các biến hệ thống để xác định bộ ký tự và đối chiếu nào sẽ sử dụng ở mỗi bước này.
Những điều sau đây chỉ ra sự đối chiếu kết nối (bạn có thể sử dụng cùng một cú pháp cho bất kỳ biến hệ thống nào):
SELECT @@collation_connection;
Kết quả ví dụ:
+------------------------+ | @@collation_connection | +------------------------+ | utf8_general_ci | +------------------------+
Bạn cũng có thể trả về tất cả các biến hệ thống bộ ký tự bằng truy vấn sau:
SHOW VARIABLES LIKE 'character_set%';
Kết quả:
+--------------------------+--------------------------------------------------------+ | 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/ | +--------------------------+--------------------------------------------------------+
Đối chiếu cấp độ cơ sở dữ liệu
Câu lệnh sau có thể được sử dụng để kiểm tra sự đối chiếu của một cơ sở dữ liệu nhất định:
USE PetHouse;
SELECT @@character_set_database, @@collation_database;
Kết quả ví dụ:
+--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb4 | utf8mb4_general_ci | +--------------------------+----------------------+
Một cách khác để làm điều đó, là sử dụng một câu lệnh như sau:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'PetHouse';
Kết quả ví dụ:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+
Sử dụng phương pháp thứ hai này cho phép bạn nhận được kết quả mà không cần chuyển đổi cơ sở dữ liệu.
Ở đây nó đang sử dụng một cơ sở dữ liệu khác:
SELECT
default_character_set_name,
default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'test';
Kết quả ví dụ:
+----------------------------+------------------------+ | default_character_set_name | default_collation_name | +----------------------------+------------------------+ | latin1 | latin1_swedish_ci | +----------------------------+------------------------+
Đây là cơ sở dữ liệu thử nghiệm được tạo khi tôi cài đặt MariaDB lần đầu tiên.
Đối chiếu cấp bảng
Câu lệnh sau trả về một số cột cung cấp thông tin về bất kỳ bảng / s phù hợp nào. Một trong những cột này được gọi là Collation và nó cung cấp sự đối chiếu của tất cả các bảng phù hợp.
SHOW TABLE STATUS LIKE '%Pets%';
Kết quả mẫu (sử dụng đầu ra dọc):
*************************** 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
Trong trường hợp này, tôi nhận được thông tin về một bảng có tên Pets
. Chúng ta có thể thấy rằng Collation
cột chứa utf8mb4_general_ci
, là đối chiếu của bảng.
Câu lệnh này cũng chấp nhận các mệnh đề khác, chẳng hạn như FROM
, WHERE
và IN
, do đó, điều này cung cấp cho bạn một số tùy chọn khi xây dựng báo cáo của mình.
Một cách khác để nhận thông tin đối chiếu về các bảng của bạn là chạy truy vấn đối với information_schema.tables
:
SELECT
table_schema,
table_name,
table_collation
FROM information_schema.tables
WHERE table_schema = 'PetHouse';
Kết quả ví dụ:
+--------------+---------------+--------------------+ | table_schema | table_name | table_collation | +--------------+---------------+--------------------+ | pethouse | vpettypecount | NULL | | pethouse | Pets | utf8mb4_general_ci | | pethouse | Owners | utf8mb4_general_ci | | pethouse | PetTypes | utf8mb4_general_ci | +--------------+---------------+--------------------+
Đối chiếu cấp độ cột
Chạy truy vấn sau sẽ trả về thông tin về từng cột trong Pets
bàn. Điều này bao gồm thông tin đối chiếu.
SHOW FULL COLUMNS FROM Pets;
Kết quả ví dụ:
+-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | 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 | | +-----------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
Ngoài ra, chúng tôi có thể truy vấn information_schema.columns
. Trong trường hợp này, chúng tôi có thể chỉ chọn các cột mà chúng tôi quan tâm:
SELECT
column_name,
character_set_name,
collation_name
FROM information_schema.columns
WHERE table_name = 'Pets';
Kết quả ví dụ:
+-------------+--------------------+--------------------+ | column_name | character_set_name | collation_name | +-------------+--------------------+--------------------+ | PetId | NULL | NULL | | PetTypeId | NULL | NULL | | OwnerId | NULL | NULL | | PetName | utf8mb4 | utf8mb4_general_ci | | DOB | NULL | NULL | +-------------+--------------------+--------------------+
Và một tùy chọn khác mà chúng tôi có trong bộ công cụ của mình là xem CREATE TABLE
tuyên bố của bảng của chúng tôi.
Như thế này:
SHOW CREATE TABLE Pets;
Kết quả:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Tuy nhiên, bộ ký tự và thông tin đối chiếu chỉ được trả về nếu chúng khác với đối chiếu mặc định của bảng. Trong ví dụ này, thông tin đối chiếu không khác nhau, và do đó không có thông tin đối chiếu nào được trả lại.
Hãy thay đổi đối chiếu:
ALTER TABLE Pets
MODIFY PetName VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL;
Và chạy SHOW CREATE TABLE
một lần nữa:
SHOW CREATE TABLE Pets;
Kết quả:
+-------+------------------------------+ | 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 | +-------+-------------------------------+
Lần này, chúng ta có thể thấy cài đặt bộ ký tự và đối chiếu mới dựa trên PetName
cột.