在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 '';
    )
    

此外,优先级如下:

  1. 如果列级别没有设置,则列级别会继承表级别的charset和collate
  2. 如果表级别没有设置,则会继承数据库级别设置
  3. 如果数据库级未设置,则会继承实例级别的设置。