📅  最后修改于: 2020-11-19 04:41:55             🧑  作者: Mango
MySQL中的排序规则是一组用于比较特定字符集中的字符的规则。它是对任何特定集合的订单序列。 MySQL支持各种字符集,并且每个字符集始终使用一个或多个排序规则,至少一个默认排序规则。 MySQL不允许我们让任何两个字符集使用相同的排序规则。
我们可以使用以下语句查看MySQL数据库服务器中所有可用的字符集的默认排序规则:
SHOW CHARACTER SET;
它将返回以下输出:
在此图像中,“默认排序规则”列值指定每个字符集的默认排序规则名称。
请注意,任何字符集的排序规则始终以字符集名称开头,并以_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作为排序规则。
以下是设置字符集和排序规则的关键点或规则: