MySQL 校对规则
在MySQL中,校对规则是用于比较特定字符集中的字符的一组规则。它是对任何特定集合的顺序。MySQL支持各种字符集,并且每个字符集始终使用一个或多个校对规则,至少一个默认的校对规则。MySQL不允许我们使用相同的校对规则来使用任何两个字符集。
我们可以使用下面的语句来查看MySQL数据库服务器中可用的所有默认校对规则的字符集:
SHOW CHARACTER SET;
它将返回以下输出:
在这个图像中, Default Collation 列的值指定每个字符集的默认排序名称。
需要注意的是,对于任何字符集,排序总是以字符集名称开头,并以 _cs
(区分大小写)_ci
(不区分大小写)或_bin
(二进制) 结尾。
默认情况下,上述语句(SHOW CHARACTER SET)会生成MySQL中所有可用的排序。如果我们想要获取特定字符集的所有排序名称,请使用SHOW COLLATION语句的可选 LIKE或WHERE子句,它返回匹配的字符集名称。
以下是用于查找特定字符集的排序名称的语法:
SHOW COLLATION LIKE 'character_set_name%';
以下语句显示MySQL中latin1字符集的所有排序名称:
SHOW COLLATION LIKE 'latin1%';
我们可以看到输出结果如下,每个字符集都具有默认的排序规则,比如 latin1_danish_ci 是 latin1 字符集的默认排序规则:
在计算机领域中,比较排序也可以用来对字符字符串进行排序。它根据权重对字符进行排序。字符字符串中的每个字符都有一个对应的权重。如果字符的权重相同,则称为相等。如果字符的权重不同,则根据它们的权重大小进行比较。
MySQL提供了 WEIGHT_STRING() 函数来找到字符串字符的权重。该函数返回一个表示权重的二进制字符串值。因此,我们需要使用 HEX(WEIGHT_STRING(str)) 函数以可打印的形式显示权重。
让我们通过一个例子来理解。下面的语句接受一个非二进制大小写不敏感的字符串 ‘AaBbCc’ ,并返回给定字母的相同权重:
SELECT HEX(WEIGHT_STRING('AaBbCc' COLLATE latin1_swedish_ci)) AS Weight;
在下面的输出中,权重A=41=a,B=42=b,C=43=c是相等的:
如果我们取一个二进制字符串 ‘AaBbCc’ 那么给定的字母它们的权重可以不同:
SELECT HEX(WEIGHT_STRING(BINARY 'AaBbCc')) AS Weight;
它将给出以下输出,其中权重A=41,a=61,B=42,b=62,C=43和c=63是不同的:
设置字符集和排序规则
MySQL允许我们以四种方式配置字符集和排序规则,如下所示:
- 在服务器级别进行设置
- 在数据库级别进行设置
- 在表级别进行设置
- 在列级别进行设置
在服务器级别设置字符集和排序规则
我们知道MySQL使用latin1作为默认字符集,使用latin1_swedish_ci作为默认排序规则。MySQL还允许我们在服务器启动时更改这些默认设置。
如果我们只在服务器启动时设置字符集,MySQL将使用指定字符集的默认排序规则。如果我们同时显式设置字符集和排序规则,MySQL将在数据库服务器上为所有创建的数据库使用这些设置。请参阅以下语句,通过命令行工具为服务器指定了 utf8 作为字符集,以及 utf8_unicode_cs 作为排序规则:
mysqld --character-set-server = utf8 --collation-server = utf8_unicode_ci
设置数据库级别的字符集和校对规则
在MySQL中创建数据库时,无需设置字符集和校对规则。这是因为MySQL会在创建数据库时使用服务器的默认字符集和校对规则。
我们可以使用CREATE DATABASE或ALTER DATABASE语句在创建数据库时修改默认设置。
以下是使用CREATE DATABASE语句创建数据库的语法:
CREATE DATABASE database_name
CHARACTER SET character_set_name;
COLLATE collation_name
以下是使用ALTER DATABASE语句创建数据库的语法:
ALTER DATABASE database_name
CHARACTER SET character_set_name
COLLATE collation_name;
当我们在数据库级别指定字符集和排序规则时,MySQL会在数据库中创建的所有表中使用它。
示例
这个示例解释了如何在数据库级别设置字符集和排序规则。
CREATE DATABASE demo_db
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
在上述语句中,我们显式地指定了数据库的字符集和校对规则。因此,它不使用服务器级别的默认设置。
设置表级别的字符集和校对规则
一个数据库会包含具有字符集和校对规则的表。这些字符集和校对规则与默认设置不同。当使用CREATE TABLE语句创建表或使用ALTER TABLE语句修改表的结构时,我们可以指定特定表的默认字符集和校对规则。
下面是使用ALTER TABLE语句创建数据库的语法。
CREATE TABLE table_name(
...
)
CHARACTER SET character_set_name
COLLATE collation_name
以下是使用ALTER TABLE语句创建数据库的语法:
ALTER TABLE table_name(
...
)
CHARACTER SET character_set_name
COLLATE collation_name
示例
该示例解释了如何在表级别设置字符集和排序规则。
USE demodb;
CREATE TABLE demotable1(
Column1 char(25)
);
在上面的示例中,我们并未在表级别指定字符集和排序规则。因此,它使用数据库的字符集和排序规则。在这里,表demotable1的字符集是utf8,排序规则是utf8_unicode_ci。
如果我们想要将上述表的字符集更改为latin1,并将排序规则更改为latin1_german1_ci,请使用以下语句:
ALTER TABLE demptable1
CHARACTER SET latin1
COLLATE latin1_german1_ci;
在列级别设置字符集和排序规则
列可以有不同的类型,例如 CHAR、VARCHAR 或 TEXT 。它可以有自己的字符集和排序规则,与表的默认设置不同。
可以使用CREATE TABLE或ALTER TABLE语句来在列的定义中更改列的字符集和排序规则设置,如下所示:
column_name [column_type] (length)
CHARACTER SET character_set_name
COLLATE collation_name
示例
这个示例解释了如何在列级别上设置字符集和校对规则。
ALTER TABLE demotable1
MODIFY column1 VARCHAR(25)
CHARACTER SET utf8mb4
COLLATION utf8mb4_0900_ai_ci;
在上面的示例中,我们在创建表时更改了列级别上确定的字符集和排序规则。因此,它使用 utf8mb4 作为字符集,使用 utf8mb4_0900_ai_ci 作为排序规则。
设置字符集和排序规则的关键点
设置字符集和排序规则的关键点或规则如下:
- 如果我们明确设置它们,可以在MySQL中同时使用字符集和排序规则。
- 如果仅设置字符集而没有指定排序规则,MySQL将使用字符集的默认排序规则。
- 如果只设置排序规则而没有指定字符集,MySQL将使用与排序规则相关联的字符集。
- 如果我们不同时指定字符集和排序规则,MySQL将使用默认的字符集和排序规则。