MySQL 整理
在本教程中,您将了解MySQL 排序规则以及如何为 MySQL 服务器、数据库、表和列设置字符集和排序规则。
摘要:在本教程中,您将了解MySQL 排序规则以及如何为 MySQL 服务器、数据库、表和列设置字符集和排序规则。
MySQL 整理介绍
MySQL 排序规则是一组规则,用于比较特定字符集中的字符。MySQL 中的每个字符集至少有一个默认排序规则。并且它可以有多个排序规则和。但是,两个字符集不能具有相同的排序规则。
MySQL 提供了 SHOW CHARACTER SET 允许您获取字符集的默认排序规则的语句:
SHOW CHARACTER SET;

默认排序规则列的值指定字符集的默认排序规则。
按照惯例,字符集的排序规则以字符集名称开头,以 _ci (不区分大小写) _cs (区分大小写)或 _bin (二进制)结尾。
要获取给定字符集的所有排序规则,请使用以下 SHOW COLLATION 语句:
SHOW COLLATION LIKE 'character_set_name%';
例如,以下语句获取 latin1 字符集的所有排序规则:
SHOW COLLATION LIKE 'latin1%';

latin1 字符集的 MySQL 排序规则
如上所述,每个字符集都有一个默认排序规则,例如, latin1_swedish_ci 是 latin1 字符集的默认排序规则。
设置字符集和排序规则
MySQL 允许您在四个级别指定字符集和排序规则:
- 服务器级别(Server)
- 数据库级别(Database)
- 数据表级别(Table)
- 字段/列级别(Column)
1) 在服务器级别设置字符集和排序规则
MySQL 将 latin1 用作默认字符集。因此,默认排序规则是 latin1_swedish_ci . 您可以在服务器启动时更改这些设置。
如果您在服务器启动时指定一个字符集,MySQL 将使用该字符集的默认排序规则。但是,如果您明确指定字符集和排序规则,MySQL 将为您将创建的所有数据库使用字符集和排序规则。
以下语句 utf8_unicode_cs 通过命令行为服务器设置 utf8 字符集和排序规则:
>mysqld --character-set-server=utf8 --collation-server=utf8_unicode_cs
2)在数据库级别设置字符集和排序规则
当您创建数据库但未指定字符集和排序规则时,MySQL 将为新数据库使用服务器的默认字符集和排序规则。
您可以使用 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 将为您在数据库中创建的表使用数据库的字符集和排序规则。
3) 在表级别设置字符集和排序规则
数据库可能包含具有与数据库的字符集和排序规则不同的字符集和排序规则的表。
您可以在使用以下 CREATE 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;
4) 在列级别设置字符集和排序规则
类型的列 CHAR , VARCHAR 或者 TEXT 可以有自己的字符集和与表的字符集和排序规则不同的排序规则。
该 CREATE TABLE 和 ALTER TABLE 语句允许您覆盖特定列的字符集和校对规则:
column_name [CHAR | VARCHAR | TEXT] (length)
CHARACTER SET character_set_name
COLLATE collation_name
设置字符集和排序规则的规则是:
- 如果您明确指定字符集和归类,则使用字符集和归类。
- 如果指定字符集并省略排序规则,则使用字符集的默认排序规则。
- 如果指定没有字符集的归类,则使用与归类关联的字符集。
- 如果同时省略字符集和排序规则,则使用默认字符集和排序规则。
我们来看一些设置字符集和排序规则的实例。
设置字符集和排序规则的实例
首先,创建一个以 utf8 作为字符集和 utf8_unicode_ci 默认排序规则的新数据库:
CREATE DATABASE mydb
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
因为我们明确指定了 mydb 数据库的字符集和排序规则,所以 mydb 不会采用数据库服务器的默认字符集和排序规则。
其次,在 mydb 数据库中创建一个名为 t1 的新表:
USE mydb;
CREATE TABLE t1(
c1 char(25)
);
在此 CREATE TABLE 语句中,我们没有指定表的字符集和排序规则 t1 。因此,MySQL 会对表使用数据库的字符集和排序规则 t1 。在这种情况下,该 t1 表将具有 utf8 默认字符集和 utf8_unicode_ci 默认排序规则。
第三,将表的字符集和排序规则更改 t1 为 latin1 and latin1_german1_ci :
ALTER TABLE t1
CHARACTER SET latin1
COLLATE latin1_german1_ci;
表中的 c1 列 t1 具有 latin1 作为字符集和 latin1_german1_ci 作为排序规则。
最后,将 c1 列的字符集更改为 latin1 :
ALTER TABLE t1
MODIFY c1 VARCHAR(25)
CHARACTER SET latin1;
现在,该 c1 列具有 latin1 字符集,但是它的排序规则呢?它是否 latin1_german1_ci 从表的排序规则中继承了排序规则?
答案是不。原因是 latin1 字符集的默认排序规则是 latin1_swedish_ci ,因此, c1 列将具有 latin1_swedish_ci 排序规则。
在本教程中,您学习了 MySQL 排序规则以及如何为 MySQL 服务器、数据库、表和列指定字符集和排序规则。
参考
- https://dev.mysql.com/doc/refman/8.0/en/charset.html – MySQL 字符集支持
- http://collation-charts.org/mysql60/ – MySQL 整理图表