在 MariaDB 中显示排序规则

发布于

在MariaDB中,排序规则可以应用于许多级别。排序规则可以在服务器级别、连接级别、数据库级别、表级别甚至列级别应用。

还可以在查询级别指定排序规则,以便它将覆盖已在数据库、表或列级别应用的任何排序规则。

MariaDB 提供了许多选项,用于在各个级别返回排序规则。

显示连接、服务器和数据库排序规则 我们可以将管理语句与子句一起使用,以返回名称中包含某个字符串的变量。SHOW VARIABLESLIKE

例:

SHOW VARIABLES LIKE ‘collation%’; 示例结果:

+———————-+——————–+ | Variable_name | Value | +———————-+——————–+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +———————-+——————–+ 这些是我在测试环境中得到的结果。您获得的结果将取决于您的设置。

如果需要,可以单独返回这些单独的变量中的每一个(见下文)。

默认情况下,显示变量。在这种情况下,它返回对当前连接有效的值。SHOW VARIABLESSESSION

因此,前面的示例可以重写如下:

SHOW SESSION VARIABLES LIKE ‘collation%’; 示例结果:

+———————-+——————–+ | Variable_name | Value | +———————-+——————–+ | collation_connection | utf8_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci | +———————-+——————–+ 或者,您可以替换为 (这是 的同义词):SESSIONLOCALSESSION

SHOW LOCAL VARIABLES LIKE ‘collation%’; 您还可以使用该修饰符显示用于与 MariaDB 的新连接的值。GLOBAL

例:

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 时创建的测试数据库。

表级排序规则 以下语句返回许多列,这些列提供有关任何匹配表的信息。其中一列称为 ,它提供所有匹配表的排序规则。Collation

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 在本例中,我获得了有关名为 的表的信息。我们可以看到该列包含 ,这是表的排序规则。PetsCollationutf8mb4_general_ci

此语句还接受其他子句,例如 、 和 ,因此这在构建语句时为您提供了一些选项。FROMWHEREIN

获取有关表的排序规则信息的另一种方法是针对 :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