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的空间

posted @ 2022-01-10 17:04  MRLL  阅读(2163)  评论(0编辑  收藏  举报