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%';
MySQL Collations for latin1 Character Set
如上所述,每个字符集具有默认排序规则,例如,latin1_swedish_ci是latin1字符集的默认排序规则。
设置字符集和排序规则
MySQL允许您在四个级别上指定字符集和排序规则:服务器,数据库,表和列。
在服务器级别设置字符集和排序规则
请注意,MySQL使用latin1作为默认字符集,因此,其默认排序规则为latin1_swedish_ci。
您可以在服务器启动时更改这些设置。
如果在服务器启动时仅指定一个字符集,则MySQL将使用该字符集的默认排序规则。
如果您同时指定字符集和排序规则,则MySQL将对数据库服务器中创建的所有数据库使用字符集和排序规则。
以下语句通过命令行为服务器设置utf8字符集和utf8_unicode_cs归类:
>mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
在数据库级别设置字符集和排序规则
创建数据库时,如果不指定其字符集和排序规则,MySQL将使用数据库的默认字符集和服务器排序规则。
您可以使用CREATE DATABASE或ALTER DATABASE语句在数据库级别覆盖默认设置,如下所示:
CREATE DATABASE database_name CHARACTER SET character_set_name; COLLATE collation_name
ALTER DATABASE database_name CHARACTER SET character_set_name COLLATE collation_name;
MySQL在数据库级别对数据库中创建的所有表使用字符集和排序规则。
在表级别设置字符集和排序规则
数据库中可能包含具有与默认数据库的字符集和排序规则不同的字符集和排序规则的表。
当您使用CREATE TABLE语句创建表格或使用ALTER TABLE语句更改表格的结构时,可以为表格指定默认字符集和排序规则。
CREATE TABLE table_name( ... ) CHARACTER SET character_set_name COLLATE collation_name
ALTER TABLE table_name( ... ) CHARACTER SET character_set_name COLLATE collation_name
在列级别设置字符集和排序规则
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 mydbdemo CHARACTER SET utf8 COLLATE utf8_unicode_ci;
因为我们为mydbdemo数据库明确指定了字符集和排序规则,所以mydbdemo不会在服务器级别采用默认的字符集和排序规则。
其次,我们在mydbdemo数据库中创建一个名为t1的新表:
USE mydbdemo; CREATE TABLE t1( c1 char(25) );
我们没有为t1表指定字符集和排序规则。
MySQL将检查数据库级别以确定t1表的字符集和排序规则。
在这种情况下,t1表的默认字符集为utf8,默认排序规则为utf8_unicode_ci。
第三,对于t1表,我们将其字符集更改为latin1并将其排序规则更改为latin1_german1_ci:
ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_german1_ci;
t1表中的c1列使用latin1作为字符集,使用latin1_german1_ci作为排序规则。
第四,让我们将c1列的字符集更改为latin1:
ALTER TABLE t2 MODIFY c1 VARCHAR(25) CHARACTER SET latin1;
现在,c1列具有latin1字符集,但是其排序规则呢?它是从表格的排序规则继承latin1_german1_ci排序规则吗?否,因为latin1字符集的默认排序规则为latin1_swedish_ci,所以c1列的排序规则为latin1_swedish_ci。
在本教程中,您了解了MySQL排序规则以及如何为MySQL服务器,数据库,表和列指定字符集和排序规则。
参考
- http://dev.mysql.com/doc/refman/5.7/en/charset.html – MySQL字符集支持
- http://collation-charts.org/mysql60/ – MySQL整理表