前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于MySQL varchar类型最大值,原来一直都理解错了

关于MySQL varchar类型最大值,原来一直都理解错了

作者头像
架构精进之路
修改2020-09-29 11:40:14
2K0
修改2020-09-29 11:40:14
举报
文章被收录于专栏:架构精进之路架构精进之路

写在前面

关于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

代码语言:javascript
复制
65535/4=16383.75

实践验证

到此貌似已经有了结论了,但实际情况真的是这样的么?

我们来实验下试试看?

代码语言:javascript
复制
mysql 版本:
select version(); // 5.7

1、若一个表只有一个varchar类型

定义如下:

代码语言:javascript
复制
CREATETABLE`t1` (  
  `c`varchar(N) DEFAULTNULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
代码语言:javascript
复制
那表 t1 的`c`字段的最大长度N为多少呢?
(65535−1−2)/4=16383

备注: · 减1的原因是实际行存储从第二个字节开始; · 减2的原因是varchar头部的2个字节表示长度; · 除4的原因是字符编码是utf8mb4。

2)若表中包含其他多种类型的情况呢

定义如下:

代码语言:javascript
复制
CREATETABLE`t2` (
  `c1`int(10) DEFAULTNULL,
  `c2`char(32) DEFAULTNULL,
  `c3`varchar(N) DEFAULTNULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
代码语言:javascript
复制
那表 t2 的`c3`字段的最大长度N为多少呢?
代码语言:javascript
复制
(65535−1−2−4−32*4)/4=16350

备注: · 减1、减2的原因同上; · 减4的原因是int类型占用4个字节; · 减32*4的原因是utf8mb4编码的char类型占用4个字节(长度32)

我们来验证一下是否如上述推断计算所述:

1)修改t2表c3字段长度为16350
代码语言:javascript
复制
alter table `t2` modify column `c3` varchar(16350);

代码语言:javascript
复制
执行成功。
2)修改t2表c3字段长度为16351
代码语言:javascript
复制
alter table `t2` modify column `c3` varchar(16351);
代码语言:javascript
复制
执行失败,报错信息如下:

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个字节,同时还要考虑到去除其他字段的占用影响。

实践出真知,可以简单试一下之后再下结论。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构精进之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 背景描述
  • 问题分析
  • 实践验证
    • 1、若一个表只有一个varchar类型
      • 2)若表中包含其他多种类型的情况呢
        • 1)修改t2表c3字段长度为16350
        • 2)修改t2表c3字段长度为16351
    • 总结一下
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档