在mysql中执行 show create table <table_name>就可以看到一张表的建表语句:
create table student {
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段1',
PRIMARY KEY (id)
} ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;
其中:
charset
(编码)是定义了字符以及字符的编码。collate
定义了字符的比较规则,因此会影响order by,where里面筛选条件的结果。此外,也会影响索引的创建,凡是涉及到字符类型比较或排序的地方,都跟collate有关。
通常,collate是与charset相关的,每种charset都有支持的collate,并且有默认的collate,比如utf8mb4编码默认为utf8mb4_general_ci。
此外,collate可以设置级别及优先级。
-
库级别:
create database <db_name> default character set utf8mb4 collate utf8mb4_unicode_ci;
-
表级别:
create table () ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
列级别:
create table ( field1 varchar(64) character set utf8mb4 collate utf8mb4_general_ci NOT NULL DEFAULT ''; )
此外,优先级如下:
- 如果列级别没有设置,则列级别会继承表级别的charset和collate
- 如果表级别没有设置,则会继承数据库级别设置
- 如果数据库级未设置,则会继承实例级别的设置。