MySQL - 校对规则



MySQL 校对规则是一组用于决定如何比较和排序字符集的各种字符的规则。MySQL 支持多种字符集,包括 ASCII、Unicode 系统、二进制等。

这些字符集的每个字符都受制于一个权重。MySQL 校对规则根据其各自的权重对字符进行排序。例如,当在一个字符集中比较两个字符时,如果一个字符的权重比另一个字符重,则它更大;反之亦然。如果两个字符的权重相等,则它们相等。

每个字符集必须至少有一个(或多个)校对规则,并且不能有两个字符集具有相同的校对规则。

实现 MySQL 校对规则

MySQL 实现各种类型的校对规则以比较字符字符串 -

  • 8 位字符集的简单校对规则

  • 8 位字符集的复杂校对规则

  • 非 Unicode 多字节字符集的校对规则

  • Unicode 多字节字符集的校对规则

  • 杂项校对规则

每个字符集都有一个内置的二进制校对规则,因此不需要重新定义它们。像这样的内置校对规则在任何情况下都不得修改,以避免服务器出现意外行为。

8 位字符集的简单校对规则

  • 由于 8 位字符集只能容纳最多 256 个字符,因此此类型的校对规则是通过使用长度为 256 的权重数组来实现的。
  • 字符集中的每个字符都与权重一一映射。
  • 它是不区分大小写的校对规则,因此相同字符的大写和小写具有相同的权重。

8 位字符集的复杂校对规则

  • 对于复杂的 8 位字符集,校对规则是通过使用函数定义字符的顺序来实现的。
  • 在这里,我们创建一个 C 源文件,该文件指定字符集属性并定义必要的支持例程以正确地对该字符集执行操作。

非 Unicode 多字节字符集的校对规则

  • 与单字节(8 位)字符不同,多字节字符的代码和权重之间存在两种类型的关系。
  • 字符的权重等于其代码。
  • 字符代码与权重一一映射,其中权重不一定等于代码。

Unicode 多字节字符集的校对规则

一些校对规则基于 Unicode 校对算法 (UCA)。它们具有以下属性 -

  • 如果一个字符有权重,则每个权重使用 2 个字节。
  • 如果一个字符没有权重,则该字符可忽略。
  • 单个字符可以有多个权重。这称为扩展。例如,德文字母(SHARP S)的权重为 0x0FEA0FEA。
  • 多个字符在一起只能有一个权重。这称为收缩。例如,“ch”在捷克语中是一个字母,其权重为 0x0EE2。

杂项校对规则

  • 不属于任何先前类别的校对规则称为杂项校对规则。

设置字符集和校对规则

MySQL 允许我们在三个不同的级别设置字符集和校对规则。下面描述了相同的内容

  • 在服务器级别

  • 在数据库级别

  • 在表级别

在服务器级别

在 MySQL 中,字符集latin1将用作默认字符集。因此,默认校对规则将为latin1_swedish_ci。MySQL 允许我们在服务器启动级别更改这些默认设置。

在启动 MySQL 服务器时,如果我们指定一个字符集,它将使用该字符集的默认校对规则。但是,如果我们显式地同时指定字符集和校对规则,则 MySQL 将对进一步创建的所有数据库使用该组合。

示例

在以下查询中,我们将字符集设置为 utf8,并将校对规则设置为 utf8_unicode_cs 用于服务器。

mysqld --character-set-server=utf8 --collation-server=utf8_unicode_cs

如果--collation-server设置为用户定义的校对规则名称,则会发出警告。

在数据库级别

当我们创建一个数据库并且如果我们没有提供任何字符集和校对规则时,数据库将使用服务器的默认字符集和校对规则。

我们可以使用 CREATE DATABASE 语句在数据库级别覆盖默认字符集和校对规则。

如果我们想覆盖现有数据库的默认设置,可以使用 ALTER DATABASE 语句。

语法

以下是覆盖数据库级别默认设置的基本语法 -

[CREATE | ALTER] DATABASE database_name  
CHARACTER SET character_set_name 
COLLATE collation_name;

示例

这里,我们正在创建一个数据库,并使用以下查询将字符集指定为 utf8,并将排序规则指定为 utf8_unicode_ci。

CREATE DATABASE testdb
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

在表级别

在 MySQL 中,数据库可以包含与数据库字符集和排序规则不同的字符集和排序规则的表。

我们可以在使用 CREATE TABLE 语句创建表时指定默认的字符集和排序规则。

如果我们想覆盖现有表的默认设置,可以使用 ALTER TABLE 语句。

语法

以下是使用 CREATE TABLE 语句为表指定默认字符集和排序规则的语法:

[CREATE | ALTER] TABLE table_name
column_name datatype (length)
CHARACTER SET character_set_name
COLLATE collation_name

示例

在以下查询中,我们正在创建一个没有任何字符集和排序规则的表。因此,它使用数据库的字符集和排序规则。

CREATE TABLE CUSTOMERS(
   ID VARCHAR(45),
   NAME VARCHAR(45),
   AGE INT
);

现在,我们使用 ALTER TABLE 语句将字符集修改为“latin1”,并将排序规则修改为“latin_german_ci”。

ALTER TABLE CUSTOMERS
CHARACTER SET latin1
COLLATE latin1_german1_ci;

显示默认校对规则

我们可以使用 SHOW CHARACTER SET 查询显示 MySQL 数据库服务器中所有字符集的默认排序规则。

SHOW CHARACTER SET;
用户定义的排序规则在最新版本的 MySQL 中已弃用。因此,如果在任何 SQL 语句中使用它们,服务器会发出警告。

每个字符集的排序规则字符串以字符集名称开头,以 _ci(不区分大小写)、_cs(区分大小写)或 _bin(二进制)结尾。

MySQL LIKE 子句

在 MySQL 中,使用 SHOW COLLATION 语句结合 LIKE 子句,我们可以指定一个模式来获取与给定模式匹配的排序规则的名称和其他信息。

SHOW COLLATION LIKE 'greek%';

输出

以上查询返回所有名称中包含greek的排序规则。

排序规则 字符集 ID 默认 已编译 排序长度
greek_bin greek 70 1
greek_general_ci greek 25 1

MySQL WHERE 子句

我们可以使用 SHOW COLLATION 语句结合 WHERE 子句来检索与指定条件匹配的排序规则名称。

SHOW COLLATION WHERE Charset = 'cp1251';

输出

以上查询返回字符集 ID 等于“cp1251”的所有排序规则。

排序规则 字符集 ID 默认 已编译 排序长度
cp1251_bin cp1251 50 1
cp1251_bulgarian_ci cp1251 14 1
cp1251_general_ci cp1251 51 1
cp1251_general_cs cp1251 52 1
cp1251_ukrainian_ci cp1251 23 1
广告