MySQL 表中行的最大大小爲 65,534(實際行存儲從第二個字節開始)字節。每一個 BLOB 和 TEXT 列只佔其中的 5 至 9 個字節。mysql
那麼來驗證下 varchar 類型的實際最大長度:
測試環境:MySQL版本 5.7.19sql
//首先要設置下 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(字符)
看示例:code
[SQL] CREATE TABLE test( va VARCHAR(21844) )DEFAULT CHARSET=utf8; Query OK, 0 rows affected
那麼看下 text 類型在實際行中佔用的字節數:utf-8
[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 個字節。table
可是 va 字段已經給 tx 字段騰出了 9 字節的空間了啊,爲何仍是不行呢。
從官方文檔看到test
BLOB 和 TEXT 類型須要 一、二、3 或者 4 個字節來記錄列值的長度,取決於該類型的最大可能的長度。效率
那麼就是至少須要 10 字節(9+1)的空間了,再試一下:sed
[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 不能指定默認值。