mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了
寫在前面
關于MySQL varchar字段類型的最大值計算,也許我們一直都理解錯誤了,本文從問題出發,經實踐驗證得出一些實用經驗,希望對大家的開發工作有些幫助~
背景描述
最近同事在做技術方案設計時候,考慮到一個表設計時希望利用varchar類型進行存儲,而不是采用text,那就需要確定下varchar允許的最大長度是多少,用來評估下后期是否會遇到存儲長度瓶頸。
那問題來了:MySQL 數據庫的varchar字段類型最大存儲長度到底是多少?
問題分析
一切以官方文檔為準,翻了下官方描述如下:
In MySQL 4.1 the length is always 1 byte. In MySQL 5.0 the length may be either 1 byte (for up to 255) or 2 bytes (for 256 to 65535).
大概意思就是說:
在MySQL 4.1以前,長度總是1個字節(varchar(20),指的是20字節)
在MySQL 5.0以后,長度可以是1字節(最多255個字節)或2個字節(256到65535)
按照官網說法最大值是65535bytes,utf8mb4編碼情況下每個字符占4個bytes,最大值應該為16383.75
65535/4=16383.75
實踐驗證
到此貌似已經有了結論了,但實際情況真的是這樣的么?
我們來實驗下試試看?
mysql 版本:select version(); // 5.7
1、若一個表只有一個varchar類型
定義如下:
CREATETABLE`t1`?(`c`varchar(N)?DEFAULTNULL)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4;
那表 t1 的`c`字段的最大長度N為多少呢?
(65535?1?2)/4=16383
備注:
· 減1的原因是實際行存儲從第二個字節開始;
· 減2的原因是varchar頭部的2個字節表示長度;
· 除4的原因是字符編碼是utf8mb4。
2)若表中包含其他多種類型的情況呢
定義如下:
CREATETABLE`t2` (`c1`int(10) DEFAULTNULL,`c2`char(32) DEFAULTNULL,`c3`varchar(N) DEFAULTNULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
那表 t2 的`c`字段的最大長度N為多少呢?
(65535?1?2?4?32*4)/4=16350
備注:
· 減1、減2的原因同上;
· 減4的原因是int類型占用4個字節;
· 減32*4的原因是utf8mb4編碼的char類型占用4個字節(長度32)
我們來驗證一下是否如上述推斷計算所述:
1)修改t2表c3字段長度為16350
alter?table?`t2`?modify?column?`c3`?varchar(16350)
執行成功。
2)修改t2表c3字段長度為16351
alter?table?`t2`?modify?column?`c3`?varchar(16351);
執行失敗,報錯信息如下:
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.
總結一下
Q:varchar到底能存多少個字符?
A:這與表使用的字符集相關,latin1、gbk、utf8、utf8mb4編碼存放一個字符分別需要占1、2、3、4個字節,同時還要考慮到去除其他字段的占用影響。
實踐出真知,可以簡單試一下之后再下結論。
往期熱文推薦:
「技術架構精進」專注架構研究,技術分享
Thanks for reading!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界第一高墩大桥!四川金阳河特大桥正式通
- 下一篇: 余额宝更换基金损失几天收益?余额宝收益怎