MySQL 中 字符集 和 排序规则
字符集
MySQL 提供了多种字符集和排序规则选择,其中字符集设置和数据存储以及客户端与 MySQL 实例的交互相关,排序规则和字符串的对比规则相关
(1). 字符集的设置可以在 MySQL 实例、数据库、表、列四个级别
(2). MySQL 设置字符集支持在 InnoDB, MyISAM, Memory 三个存储引擎
(3). 查看当前 MySQL 支持的字符集的方式有两种,一种是通过查看 information_schema.character_sets 系统表,一种是通过命令【 show character set; 】查看。
1 2 3 4 5 6 7 8 9 10 11
| mysql> select * from character_sets; +--------------------+----------------------+---------------------------------+--------+ | CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN | +--------------------+----------------------+---------------------------------+--------+ | ascii | ascii_general_ci | US ASCII | 1 | | gbk | gbk_chinese_ci | GBK Simplified Chinese | 2 | | utf8 | utf8_general_ci | UTF-8 Unicode | 3 | | utf8mb4 | utf8mb4_general_ci | UTF-8 Unicode | 4 | +--------------------+----------------------+---------------------------------+--------+ 41 rows in set (0.00 sec)
|
1 2 3 4 5 6 7 8 9 10 11
| mysql> show character set; +----------+---------------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+---------------------------------+---------------------+--------+ | ascii | US ASCII | ascii_general_ci | 1 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | +----------+---------------------------------+---------------------+--------+ 41 rows in set (0.00 sec)
|
常见的MySQL字符集主要有以下四种:
1 2 3 4 5 6
| 字符集 长度 说明 GBK 2 支持中文,但是不是国际通用字符集 UTF-8 3 支持中英文混合场景,是国际通用字符集 latin1 1 MySQL默认字符集 utf8mb4 4 完全兼容UTF-8,用四个字节存储更多的字符
|
• 如果系统开发面向国外企业,需要处理不同国家、不同语言,则应该选择utf-8或者utf8mb4。
• 如果只需要支持中文,没有国外业务,则为了性能考虑,可以采用GBK。
默认服务器字符集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| mysql> show variables like '%character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
|
名词解释:
character_set_client:客户端请求数据的字符集
character_set_connection:客户机/服务器连接的字符集
character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
character_set_filesystem:把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
character_set_results:结果集,返回给客户端的字符集
character_set_server:数据库服务器的默认字符集
character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。
排序规则
每个指定的字符集都会有一个或多个支持的排序规则,可以通过两种方式查看,一种是查看 information_schema.collations 表,另一种是通过【show collation】命令查看
(1). 查看 utf8mb4 字符集对应的排序规则有哪些。
1 2 3 4 5 6 7 8 9 10 11 12 13
| mysql> show collation where charset ='utf8mb4'; +------------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +------------------------+---------+-----+---------+----------+---------+ | utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 | | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | +------------------------+---------+-----+---------+----------+---------+ 26 rows in set (0.00 sec)
mysql>
|
(2).剖析排序规则
排序规则的命令通常是以对应的字符集的名字为开头,并以自己的特定属性结尾,比如排序规则 utf8_general_ci 和 latin1_swedish_ci 就分别是对应 utf8 和 latin1 字符集的排序规则
• 当排序规则特指某种语言时,则中间的部分就为这种语言的名字,比如 utf8_turkish_ci 和 utf8_hungarian_ci 就代表 UTF8 字符集中的土耳其语和匈牙利语
• 排序规则名字的结尾字符代表是否大小写敏感,重音敏感以及是否是二进制的.ai重音不敏感,as重音敏感。ci大小写不敏感,cs大小写敏感。bin二进制。
• A. 当仅指定了字符集而没有指定排序规则时,则会使用该字符集的默认排序规则
• B. 当仅指定了排序规则而没有字符集时,则在该排序规则名称上含有的字符集会被使用
• C. 当数据库创建时没有指定这两项,则使用实例级别的字符集和排序规则
设置字符集/字符序
数据库的字符集、字符序
创建数据库:
1 2 3
| CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
|
修改数据库:
1 2 3 4 5
| ALTER DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
|
例子:创建数据库test_schema,字符集设置为utf8,此时默认的排序规则为utf8_general_ci。
1 2 3 4
| CREATE DATABASE `test_schema` DEFAULT CHARACTER SET utf8;
CREATE DATABASE `luban` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_bin;
|
查看新创建的数据库的字符集和排序规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| mysql> SHOW CREATE DATABASE luban; +----------+---------------------------------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------------------------------+ | luban | CREATE DATABASE `luban` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ | +----------+---------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name="luban"; +-------------+----------------------------+------------------------+ | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +-------------+----------------------------+------------------------+ | luban | utf8mb4 | utf8mb4_bin | +-------------+----------------------------+------------------------+ 1 row in set (0.00 sec)
|
table的字符集、字符序
创建表、修改表的语法如下,可通过CHARACTER SET、COLLATE设置字符集、字符序。
1 2 3
| CREATE TABLE tbl_name (column_list) [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]
|
1 2 3
| ALTER TABLE tbl_name [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
|
例子如下,指定字符集为utf8,字符序则采用默认的。
1 2 3 4
| CREATE TABLE `test_schema`.`test_table` ( `id` INT NOT NULL COMMENT '', PRIMARY KEY (`id`) COMMENT '') DEFAULT CHARACTER SET = utf8;
|
column的字符集、排序
类型为CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序,语法如下:
1 2 3
| col_name {CHAR | VARCHAR | TEXT} (col_length) [CHARACTER SET charset_name] [COLLATE collation_name]
|
例子如下:(创建table类似)
1
| mysql> ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;
|
何时设置字符集、字符序
一般来说,可以在三个地方进行配置:
创建数据库的时候进行配置。
mysql server启动的时候进行配置。
从源码编译mysql的时候,通过编译参数进行配置