📜  MySQL排序规则

📅  最后修改于: 2020-11-19 04:41:55             🧑  作者: Mango

MySQL排序规则

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作为排序规则。

设置字符集和排序规则的要点

以下是设置字符集和排序规则的关键点或规则:

  • 如果我们明确设置字符集和排序规则,则可以在MySQL中使用它们。
  • 如果我们设置了唯一的字符集而不指定排序规则,则MySQL使用该字符集的默认排序规则。
  • 如果我们仅设置排序规则而不指定字符集,则MySQL使用与排序规则关联的字符集。
  • MySQL使用的默认字符集和校对规则,如果我们不同时指定字符集和校对。