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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM