MySQL varchar 最大長度,text 類型占用空間剖析


MySQL 表中行的最大大小為 65,534(實際行存儲從第二個字節開始)字節。每個 BLOB 和 TEXT 列只占其中的 5 至 9 個字節。

那么來驗證下 varchar 類型的實際最大長度:
測試環境:MySQL版本 5.7.19

//首先要設置下 mysql 為嚴格執行模式,不然 varchar 超出最大長度為自動轉為 text 類型
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
[SQL]
CREATE TABLE test(
    va VARCHAR(21845)
)DEFAULT CHARSET=utf8;
1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

這里看到 21,845 個字符,utf-8 下剛好為 65,535 個字節,但是 varchar 保存時用一個字節或兩個字節長的前綴+數據。如果 varchar 列聲明的長度大於 255,長度前綴是兩個字節,所以 varchar 的最大長度應為:

65532=65535-1-2(字節)
utf-8 下為 21844=65532/3(字符)

看示例:

[SQL]
CREATE TABLE test(
    va VARCHAR(21844)
)DEFAULT CHARSET=utf8;
Query OK, 0 rows affected

那么看下 text 類型在實際行中占用的字節數:

[SQL]
CREATE TABLE test1(
    va VARCHAR(21841),
    tx text
)DEFAULT CHARSET=utf8;
1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

可以看出錯誤提示,行長已經超過最大長度。在上文看到,

每個 BLOB 和 TEXT 列只占其中的 5 至 9 個字節。

但是 va 字段已經給 tx 字段騰出了 9 字節的空間了啊,為什么還是不行呢。
從官方文檔看到

BLOB 和 TEXT 類型需要 1、2、3 或者 4 個字節來記錄列值的長度,取決於該類型的最大可能的長度。

那么就是至少需要 10 字節(9+1)的空間了,再試一下:

[SQL]
CREATE TABLE test1(
    va VARCHAR(21840),
    tx text
)DEFAULT CHARSET=utf8;
Query OK, 0 rows affected

這里看到,當 va 字段騰出 12 字節的空間時,表可以創建成功。

varchar 最長是 64k,但是注意 這里的 64k 是整個 row 的長度,要考慮到其它的 column,還有如果存在 not null 的時候也會占用一位,對不同的字符集,有效長度還不一樣,比如 utf8,最多 21,845,還要除去別的 column,但是 varchar 在一般情況下存儲都夠用了。

如果遇到了大文本,考慮使用 text,最大能到 4G。效率來說基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的話,推薦使用 varchar 代替 char。char 和 varchar 可以有默認值,text 不能指定默認值。


免責聲明!

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



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