首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

varchar有最大长度限制吗

先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。

varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。

在早期低版本中代表的是字节,具体哪个版本我也没去验证了,后来被改成了字符,不过可以肯定的是在 5.1 版本后, varchar(100) 就是指 100 个字符。

说到 varchar ,一般都会拿 char 来做比较说明。

char 是固定长度,其单位也是字符,比如 char(10),就表示不管你给的什么值,都会被 mysql 固定保存成 10 个字符。

如果给的字符长度小于 10,那么在尾部就会自动用空格补齐。

如果大于 10,在严格模式(strict sql mode)下就会报错,在非严格模式下就会对内容做自动截取操作。

另外 char 也是有最大长度限制的,最大长度为 255, 即 char 类型最多只能保存 255 个字符,char(256) 这都是错误的写法,可以看下面的例子。

下面是 char 和 varchar 对于同一个字符所需要的不同的存储空间,这里假设使用的是 latin1单字节字符集。

细心的你可能会发现 varchar 的存储空间会比字符的实际长度多 1 个字节,这是因为 varchar 需要额外增加 1 到 2 个字节来存储字符的长度,这个值被称作前缀

也就是说在 varchar 类型中,除了字符本身实际占用的空间外,还需要 1 个或 2 个字节来声明这个字符的长度。

如果存储的值小于 255 个字节,则使用 1 个字节来存储前缀,如果大于 255 个字节则使用 2 个字节来存储前缀。

关于字符集和字节的关系,以及字节 (byte) 与位 (bit) 的关系。

好了,再坚持一会,回到文章开头的问题,为啥 varchar 最大长度是 65535 个字节呢,其实这个是受 mysql 另一个规则限制导致的,mysql 规定了每行数据大小不能超过 65535 个字节

另外还有一个小问题,一个字段如果允许为 null ,在 mysql 中也是需要增加额外空间来单独标识的,反之则不需要这个额外空间,至于这个空间大小具体是怎么计算的,我目前也还没有研究过。

基于上面几个实例,基本上可以得出计算 varchar 最大长度限制的公式。

varchar 最大长度限制 = (行最大字节数(65535) - null 标识字节数 - 长度前缀字节数(1或2)) / 字符集单字符占用最多字节数

看到这里,不知道你有没有一个疑问,为什么长度前缀 1 或 2 个字节就够用了呢,因为 2 个字节的话,2^16 = 65536,这已经超过 mysql 行最大字节数 65535 的限制了,所以 1 到 2 个字节就够用了。

最后再看一个综合例子,我们创建一个表,采用 UTF8 字符集,添加两个非空字段,分别为 char 和 varchar 类型,char 类型长度给定为 255。

那么 varchar 类型字段的最大字节数应该就是,

65535 (行最大字节数) - 255*3 (一个字符最多占 3 个字节) = 64770,

然后再减去 2 个长度前缀字节,

64770 - 2 = 64768,

最后再算出 varchar 最大字符数为 64768 / 3 = 21589.33,

好了,关于 varchar 的最大长度问题就聊到这了,文中如有错误,欢迎大家批评指出,更欢迎大家交流讨论,如果文章对你有帮助,点个在看表示对我的支持哈,感谢。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200106A03Y7500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券