MYSQL踩坑经历

设置自动记录创建和更新时间的坑

在MySQL5.7版本下执行下面建表语句不会报错。MySQL5.5版本使用下面的语句会报错:
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,

上面的语句在MySQL5.7执行没问题,但在5.5执行有两个bug:
1、MySQL5.5版本只有timestamp类型能使用CURRENT_TIMESTAMP,datetime不能设置CURRENT_TIMESTAMP。
2、MySQL5.5版本一张表只能有一个字段可以设置CURRENT_TIMESTAMP。不支持多个字段设置CURRENT_TIMESTAMP了。

解决方案

1、用触发器。
2、用代码去更新时间吧。(所以在建表的时候还是得先判断测试环境和正式环境的数据库版本是否满足要求,不然后面就蛋疼了~~)

设置字符串索引的长度限制

在MySQL5.7下执行以下建表语句不会报错。但是在MySQL5.5报错了。
建表语句如下:
CREATE TABLE etcd_key_desc(
id int(10) unsigned NOT NULL AUTO_INCREMENT,
key_name varchar(200) NOT NULL COMMENT ‘key的名称’,
PRIMARY KEY (id),
UNIQUE KEY idx_key_name (key_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘key详情表’;

报错内容:
Specified key was too long; max key length is 767 bytes

分析:
MySQL5.6以前的版本,字符索引长度限制为767个字节,到5.7版本才变为3072个字节。
这里的key_name作为索引的长度超过了767个字节,因为字符集类型是是utf8mb4,一个字符占4个字节,所以索引长度为200*4=800字节。所以在5.6版本才会报错,而5.7版本不会。

MySQL文档:
767 bytes is the stated prefix limitation for InnoDB tables in MySQL version 5.6 (and prior versions). It’s 1,000 bytes long for MyISAM tables. In MySQL version 5.7 and upwards this limit has been increased to 3072 bytes.

三种解决方案

1、如果确定key_name不会存储特殊字符,就可以修改字符集为utf8(CHARSET=utf8),因为一个utf8类型的字符占用的3个字节。所以utf8下的字符我们一般可以设置255长度:255*3=765。
2、把key_name的长度设为180(反正乘以4小于767字节即可)
3、设置前缀索引

总结

建表的时候,要确认测试环境和正式环境的MySQL版本,避免版本不兼容带来的代码返工!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值