Mysql 简明教程

MySQL - Collation

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

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

每个字符集都必须至少有一个校对(或更多),并且没有两个字符集可以具有相同的校对。

Implementing MySQL Collations

MySQL 实施了各种类型的校对,用于比较字符串 −

  1. 8 位字符集的简单校对

  2. 8 位字符集的复杂校对

  3. 非 Unicode 多字节字符集的校对

  4. Unicode 多字节字符集的校对

  5. Miscellaneous Collations

每个字符集都具有内置的二进制校对,因此不需要重新定义它们。在任何情况下都不应修改这些内置校对,以免产生意外的服务器行为。

Simple Collations for 8-bit Character Sets

  1. 由于 8 位字符集只能容纳多达 256 个字符,因此这种类型的校对通过使用长度为 256 的权重数组来实现。

  2. 字符集中每个字符都与权重一一映射。

  3. 它是不区分大小写的校对,因此同一字符的大写和小写具有相同的权重。

Complex Collations for 8-bit Character Sets

  1. 对于复杂的 8 位字符集,通过使用函数定义字符顺序实施整理规则。

  2. 在此,我们创建一个 C 源文件,用于指定字符集属性并定义必需的支持例程,以正确对该字符集执行操作。

Collations for Non-Unicode Multibyte Character Sets

  1. 与单字节(8 位)字符不同,多字节字符的代码和权重之间有两种类型的关系。

  2. 字符的权重等于其代码。

  3. 字符代码映射到权重,其中权重不一定等于代码。

Collations for Unicode Multibyte Character Sets

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

  1. 如果一个字符具有权重,则每个权重使用 2 个字节。

  2. 如果一个字符没有权重,则该字符可忽略。

  3. 单个字符可以包含很多权重。这称为展开。例如,德语字母(SHARP S)的权重为 0x0FEA0FEA。

  4. 多个字符一起只能有一个权重。这称为收缩。例如,“ch”是捷克语中的一个单字符,权重为 0x0EE2。

Miscellaneous Collations

  1. 不属于任何先前类别的整理规则称为其他整理规则。

Set Character Set and Collation

MySQL 允许我们在三个不同的级别设置字符集和整理规则。以下内容对此进行了描述:

  1. At Server level

  2. At Database level

  3. At Table level

At Server Level

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

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

Example

在以下查询中,我们将服务器的字符集设置为 utf8,整理规则设置为 utf8_unicode_cs。

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

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

At Database Level

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

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

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

Syntax

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

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

Example

这里,我们正在使用以下查询创建数据库,并将字符集指定为 utf8,并将校对指定为 utf8_unicode_ci:

CREATE DATABASE testdb
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

At Table Level

在 MySQL 中,数据库可能包含与数据库的字符集和校对不同的字符集和校对的表。

我们可以使用 CREATE TABLE 语句在创建表时指定默认字符集和校对。

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

Syntax

以下是使用 CREATE TABLE 语句为表指定默认字符集和校对的语法:

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

Example

在以下查询中,我们创建了一个不带任何字符集和校对的表。因此,它使用了数据库的字符集和校对。

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;

Displaying Default Collations

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

SHOW CHARACTER SET;

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

The MySQL LIKE Clause

在 MySQL 中,使用 LIKE 子句与 SHOW COLLATION 语句,我们可以指定模式来获取与给定模式匹配的校对名称和其他信息。

SHOW COLLATION LIKE 'greek%';

Output

上面的查询返回名称中包含 greek 的所有校对。

The MySQL WHERE Clause

我们可以将 WHERE 子句与 SHOW COLLATION 语句一起使用,以检索与指定条件匹配的校对名称。

SHOW COLLATION WHERE Charset = 'cp1251';

Output

上面的查询返回字符集 ID 等于“cp1251”的所有校对。