从 MySQL 添加外键失败看 MySQL 字符集

问题现象

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
    
  • 列级别

    同表级别

如果当前级别没有指定字符集和比较规则,就使用上一级的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值