mysql不锁表增加字段长度
格式优化版本
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个字母。
varchar2最大长度字段的长度由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的空间