mysql不锁表增加字段长度
格式优化版本
https://www.wolai.com/hssxHv9Zws2g9RHS2oofYT
mysql版本>5.5
latin1:
1character=1byte, 1汉字=2character,
也就是说一个字段定义成 varchar(200),则它可以存储100个汉字或者200个字母。
这一点要注意,尤其是当字段内容是字母和汉字组成时,尽量假设字段内容都是由汉字组成,据此来设置字段长度
utf8:
1character=3bytes, 1汉字=1character
也就是说一个字段定义成 varchar(200),则它可以存储200个汉字或者200个字母。
gbk:
1character=2bytes,1汉字=1character
也就是说一个字段定义成 varchar(200),则它可以存储200个汉字或者200个字母。
utf8mb4
1character=4bytes, 1汉字=1character
也就是说一个字段定义成 varchar(200),则它可以存储200个汉字或者200个字母。
字段的长度由1~2个byte进行储存
当字段长度的储存字节不需要改变时,可以通过online ddl in-place
模式(不锁表)进行字段长度修改(无论是1→1,还是2→2)
ALTER TABLE `zzw_test`.`test2`
MODIFY COLUMN `utf8mb4` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL AFTER `utf8`,ALGORITHM=INPLACE
当字段长度的储存字节需要从1→2时,只能通过copy
的方式进行长度修改
ALTER TABLE `zzw_test`.`test2`
MODIFY COLUMN `utf8mb4` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL AFTER `utf8`,ALGORITHM=copy
当字段长度时缩小时,也只能通过copy
的方式进行修改
一个byte
是8位 1111 1111
可以储存255的数字
对于latin1
来说,varchar(255)时只用一个byte就可以进行储存(这就是为什么默认是255的原因)
对于utf8
来说,varchar(85)时只用一个byte就可以进行储存
对于utf8mb4
来说,varchar(63)时只用一个byte就可以进行储存
所以简单概括下
对于latin1
来说,只有扩充前字段长度≤255,并且扩充后字段长度>255时需要锁表
对于utf8
来说,只有扩充前字段长度≤85,并且扩充后字段长度>85时需要锁表
对于utf8mb4
来说,只有扩充前字段长度≤63,并且扩充后字段长度>63时需要锁表
顺便可以把varchar默认的255改下,现在大部分场景都是utf8mb4
,给个63的长度可以节约1byte的空间