问题现象
MySQL 数据库中有两个表,
表 a 的结构如下:
CREATE TABLE `a` (
`uuid` varchar(32) NOT NULL,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`uuid`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
表 b 的结构如下:
CREATE TABLE `b` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`text` varchar(64) DEFAULT NULL,
`a_uuid` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8
给表 b 的 a_uuid 字段添加外键关联表 a 的 uuid 字段时报错:
GenerationTarget encountered exception accepting command : Error executing DDL "alter table b add constraint FKnelmankny30bplnr0f86n9bop foreign key (a_uuid) references a (uuid)" via JDBC Statement
问题原因
因为表 b 的字段 a_uuid 和表 a 的字段 uuid 的字符集不一样,前者是 utf8,后者是 utf8mb4,所以添加外键失败。
在 MySQL 中,
-
字符集utf8 是 utf8mb3 的别名,是精简的 utf8 字符集,使用 1 ~ 3 个字节表示字符
-
字符集utf8mb4 是正宗的 utf8 字符集,使用 1 ~ 4 个字节表示字符
MySQL 字符集和比较规则
级别从大到小(各级别的字符集和比较规则的查看命令)依次如下,
-
服务器级别
show variables like 'character_set_server'; show variables like 'collation_server'; -
数据库级别
需要先使用 USE 语句选择数据库,再使用如下 sql 查看
show variables like 'character_set_database'; show variables like 'collation_database'; -
表级别
show create table xxx -
列级别
同表级别
如果当前级别没有指定字符集和比较规则,就使用上一级的。
2519

被折叠的 条评论
为什么被折叠?



