MySQL中列定义何时包含CHARACTER SET?列属性差异疑问
MySQL 8中
SHOW CREATE TABLE列字符集标记差异解析 核心结论
这两个列没有任何实际功能差异,字符集、排序规则完全一致,仅在SHOW CREATE TABLE输出中的显示标记不同——这个标记只是MySQL用来记录列属性的显式指定状态,对数据存储、查询行为无影响。
详细解释
标记的由来
- 当列的字符集/排序规则完全继承自表级默认配置时(比如示例中的
col1,创建时未指定任何字符集或排序规则,直接继承表的utf8mb4字符集和utf8mb4_unicode_ci排序规则),SHOW CREATE TABLE只会输出与表默认不一致的属性。由于示例中表的排序规则utf8mb4_unicode_ci并非utf8mb4字符集的默认排序规则(MySQL 8中utf8mb4默认是utf8mb4_0900_ai_ci),所以需要显式标注COLLATE,但字符集和表一致,因此省略CHARACTER SET。 - 当列显式指定了排序规则时(比如示例中的
col2,创建时明确写了COLLATE utf8mb4_unicode_ci),MySQL会在SHOW CREATE TABLE中同时输出CHARACTER SET和COLLATE——即使字符集和表默认一致,这是为了完整还原用户当初的显式定义,让生成的CREATE TABLE语句和用户原始输入的逻辑更贴近。
- 当列的字符集/排序规则完全继承自表级默认配置时(比如示例中的
无实际差异的验证
查询information_schema.COLUMNS后,两列的CHARACTER_SET_NAME均为utf8mb4,COLLATION_NAME均为utf8mb4_unicode_ci,说明二者在存储引擎层面的属性完全相同,数据处理、查询性能等方面没有任何区别。标记的作用
这个标记仅仅是元数据层面的记录,作用是在生成CREATE TABLE语句时,尽可能还原用户最初的定义方式,方便用户理解表结构的创建逻辑,不会对数据库的实际运行产生任何影响。
内容的提问来源于stack exchange,提问作者Georg Schölly
相关产品推荐
相关产品推荐

