格式優化版本
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的空間
