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

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

如上所述,每个字符集都有一个默认排序规则,例如latin1_swedish_ci
是latin1
字符集的默认排序规则。
设置字符集和排序规则
MySQL 允许您在四个级别上指定字符集和排序规则:
- 服务器
- 数据库
- 桌子
- 柱子
1) 在服务器级别设置字符集和排序规则
MySQL 使用latin1
作为默认字符集。因此,默认排序规则为latin1_swedish_ci
。您可以在服务器启动时更改这些设置。
如果您在服务器启动时指定一种字符集,MySQL 将使用该字符集的默认排序规则。但是,如果您显式指定字符集和排序规则,MySQL 将为您将创建的所有数据库使用该字符集和排序规则。
以下语句通过命令行为服务器设置 utf8 字符集和utf8_unicode_cs
排序规则:
>mysqld --character-set-server=utf8 --collation-server=utf8_unicode_cs
Code language: SQL (Structured Query Language) (sql)
2)在数据库级别设置字符集和排序规则
当您创建数据库但未指定字符集和排序规则时,MySQL 将为新数据库使用服务器默认的字符集和排序规则。
您可以使用CREATE DATABASE
语句覆盖数据库级别的默认设置:
CREATE DATABASE database_name
CHARACTER SET character_set_name
COLLATE collation_name;
Code language: SQL (Structured Query Language) (sql)
或使用ALTER DATABASE
语句:
ALTER DATABASE database_name
CHARACTER SET character_set_name
COLLATE collation_name;
Code language: SQL (Structured Query Language) (sql)
默认情况下,MySQL 将为您在数据库中创建的表使用数据库的字符集和排序规则。
3)在表级别设置字符集和排序规则
数据库可能包含其字符集和排序规则与数据库的字符集和排序规则不同的表。
您可以在使用CREATE TABLE
语句创建表时指定表的默认字符集和排序规则:
CREATE TABLE table_name(
...
)
CHARACTER SET character_set_name
COLLATE collation_name;
Code language: SQL (Structured Query Language) (sql)
或者当您使用ALTER TABLE
语句更改表时:
ALTER TABLE table_name(
...
)
CHARACTER SET character_set_name
COLLATE collation_name;
Code language: SQL (Structured Query Language) (sql)
4)在列级别设置字符集和排序规则
CHAR
、 VARCHAR
或TEXT
类型的列可以有自己的字符集和排序规则,该字符集和排序规则不同于表的字符集和排序规则。
CREATE TABLE
和ALTER TABLE
语句允许您覆盖特定列的字符集和排序规则:
column_name [CHAR | VARCHAR | TEXT] (length)
CHARACTER SET character_set_name
COLLATE collation_name
Code language: SQL (Structured Query Language) (sql)
设置字符集和排序规则的规则是:
- 如果显式指定字符集和排序规则,则使用字符集和排序规则。
- 如果指定字符集并省略排序规则,则使用该字符集的默认排序规则。
- 如果指定没有字符集的排序规则,则使用与该排序规则关联的字符集。
- 如果同时省略字符集和排序规则,则使用默认字符集和排序规则。
让我们看一些设置字符集和排序规则的示例。
设置字符集和排序规则的示例
首先,创建一个新数据库,以 utf8 作为字符集,以utf8_unicode_ci
作为默认排序规则:
CREATE DATABASE mydb
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
Code language: SQL (Structured Query Language) (sql)
由于我们显式指定了mydb
数据库的字符集和排序规则,因此mydb
不会采用数据库服务器的默认字符集和排序规则。
其次,在mydb
数据库中创建一个名为t1
的新表:
USE mydb;
CREATE TABLE t1(
c1 char(25)
);
Code language: SQL (Structured Query Language) (sql)
在此CREATE TABLE
语句中,我们没有指定t1
表的字符集和排序规则。因此,MySQL将为t1
表使用数据库的字符集和排序规则。在这种情况下, t1
表将使用utf8
作为默认字符集,并utf8_unicode_ci
作为默认排序规则。
第三,将表t1
的字符集和排序规则更改为latin1
和latin1_german1_ci
:
ALTER TABLE t1
CHARACTER SET latin1
COLLATE latin1_german1_ci;
Code language: SQL (Structured Query Language) (sql)
t1
表中的c1
列使用latin1
作为字符集,使用latin1_german1_ci
作为排序规则。
最后,将c1
列的字符集更改为latin1
:
ALTER TABLE t1
MODIFY c1 VARCHAR(25)
CHARACTER SET latin1;
Code language: SQL (Structured Query Language) (sql)
现在, 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 排序图表