mysql获取varchar列最⼤值_关于MySQLvarchar类型最⼤值,
原来⼀直都理解错了
写在前⾯
关于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) o
r 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;
varchar2最大长度那表 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!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论