Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >varchar有最大长度限制吗

varchar有最大长度限制吗

作者头像
谭小谭
发布于 2020-01-15 07:32:13
发布于 2020-01-15 07:32:13
16.5K00
代码可运行
举报
文章被收录于专栏:谭小谭谭小谭
运行总次数:0
代码可运行

先说结论,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) 这都是错误的写法,可以看下面的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##创建一个表,同时声明address字段长度为256会报错,最大为255
mysql> create table test2 ( address char(256) );
ERROR 1074 (42000): Column length too big for column 'address' (max = 255); use BLOB or TEXT instead

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

CHAR(4)

存储空间大小(字节)

VARCHAR(4)

存储空间大小(字节)

''

' '

4 bytes

''

1 byte

'ab'

'ab '

4 bytes

'ab'

3 bytes

'abcd'

'abcd'

4 bytes

'abcd'

5 bytes

'abcdef'

'abcd'

4 bytes

'abcd'

5 bytes

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 byte (字节) = 8 bit ()

2^8 = 256

所以计算机里常见的 255256 临界值绝大多数与这个有关

1 个字节具体占多大的空间,这与所使用的字符集有关系

比如 latin1 单字节字符集,1 个字符即占 1 个字节

我们常见的 GBKUTF8UTF8-MB4 这些都是多字节字符集

GBK :一个字符最多占 2 个字节
UTF8:一个字符最多占 3 个字节
UTF8MB4:一个字符最多占 4 个字节

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

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

结合上面说的几点,下面来通过几个实例来验证下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##字符集设置为latin1,1个字符=1个字节,字段允许为null
mysql> create table test ( address varchar(65536) default null ) charset=latin1;
ERROR 1074 (42000): Column length too big for column 'address' (max = 65535); use BLOB or TEXT instead

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##减去varchar前缀长度标识2个字节,还是报错,说明null标识也占用了空间
mysql> create table test ( address varchar(65533) default null ) charset=latin1;
ERROR 1118 (42000): 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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##把字段设置为非空即可建表成功
mysql> create table test ( address varchar(65533) not null ) charset=latin1;
Query OK, 0 rows affected (0.01 sec)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##如果字符集设置为UTF8,那么 max=65535/3=21845,一个字符最多占3个字节
mysql> create table test2 ( address varchar(65533) not null ) charset=UTF8;
ERROR 1074 (42000): Column length too big for column 'address' (max = 21845); use BLOB or TEXT instead

基于上面几个实例,基本上可以得出计算 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,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##字符数21590超过最大字符数会报错
mysql> create table test4 (name char(255) not null, address varchar(21590) not null ) charset=utf8;
ERROR 1118 (42000): 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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##字符数21589则刚好能创建成功
mysql> create table test4 (name char(255) not null, address varchar(21589) not null ) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.02 sec)

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

推荐文章:

最近发现一个可以捡零花钱的活

mysql为什么建议使用自增主键

如何分析一条sql的性能

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

本文分享自 谭小谭 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别
看完这篇文章,你能搞清楚以下问题: 1、varchar(100)和varchar(10)的区别在哪里? 2、varchar能存多少汉字、数字? 3、varchar的最大长度是多少呢? 4、字符、字节、位,之间的关系? 5、mysql字段类型存储需要多少字节? 接下来请仔细看,整理不易啊。 1、varchar(100)和varchar(10)的区别在哪里? 一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【不准确的想法:varchar在实际存储的时候会多一个b
NateHuang
2020/03/06
8.8K0
InnoDB(4)行溢出--mysql从入门到精通(九)
上篇文章说了compact行格式中真实数据存储,真实数据innoDB会默认添加transaction_id事务id,roll_pointer回滚指针,其中row_id不是必须的,当用户设置了primery key主键默认用用户设置的,没设置,找一个unique列,若都没有,则会用row_id。
用户9919783
2022/07/26
6060
MySQL之表的数据类型
一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql常用数据类型概览 #1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的
人生不如戏
2018/04/10
5.7K0
MySQL之表的数据类型
细说varchar与char有哪些区别?
  VARCHAR类型用于存储可变长度字符串,是最常见的字符串数据类型。它比固定长度类型更节省空间,因为它仅使用必要的空间(根据实际字符串的长度改变存储空间)。   有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储。
陈哈哈
2021/10/13
1.6K0
MySQL VARCHAR(M)最多能存储多少数据
MySQL定义VARCHAR(M)最多可以是65535个字节,M表示的是「字符数量」,但是实际存储中并不能存储那么多字节。如果一个字段超过了65535个字节,可以选择使用TEXT或者BLOB类型。
索码理
2022/09/20
9790
MySQL CHAR 和 VARCHAR 的区别
根据 MySQL 的官方文档 The CHAR and VARCHAR Types 中的描述, varchar和char的区别主要有:
恋喵大鲤鱼
2023/11/01
1.2K0
MySQL | VARCHAR(200)能存200个汉字吗?
在数据库设计中,选择合适的数据类型对于确保数据的有效存储和查询效率至关重要。对于需要存储文本信息的场景,我们常会使用VARCHAR类型。 然而,对于不同语言的字符,VARCHAR所能存储的数量会有所不同。
烟雨平生
2024/04/17
3.8K0
MySQL | VARCHAR(200)能存200个汉字吗?
技术分享 | 关于 MySQL Online DDL 有趣的验证
爱可生 DBA 团队成员,主要负责 MySQL 故障处理和 SQL 审核优化。对技术执着,为客户负责。
爱可生开源社区
2020/12/14
7190
技术分享 | 关于 MySQL Online DDL 有趣的验证
mysql基础
创建mysql数据表的时候,通常会指定类型和长度,那么到底代表什么意思呢,每种类型最大长度又是多少,经过我的查阅资料和实验,把结果记录一下
leobhao
2022/06/28
3530
从一个慢查询到MySQL字符集编码
最近在完成一个线上日志修复工作的过程中遇到了一个意想不到的慢查询。当时使用的SQL以及表结构其实都很简单,而且在关键的字段上也有索引,但是MySQL的执行计划就是跑出来了Range checked for each record (index map: 0x1)。如下为问题中的表结构定义和执行计划(删减了其他字段,留下了关键的部分):
DBA札记
2024/01/09
4610
从一个慢查询到MySQL字符集编码
MySQL长文本字段的选取
<1>.先将content字段设为varchar(255),则此字段只能最多存储255个字符数
fliter
2023/09/23
3790
MySQL长文本字段的选取
MySQL的varchar水真的太深了——InnoDB记录存储结构
InnoDB处理数据的过程是发生在内存中的,需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。
砖业洋__
2023/05/12
2K0
MySQL的varchar水真的太深了——InnoDB记录存储结构
mysql中的varchar_从数据类型varchar转化为
这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM中的varchar等问题,需要的朋友可以参考下
全栈程序员站长
2022/10/02
1.6K0
Java进阶笔记——MySql中的varchar类型
MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。
慕容千语
2019/06/12
2.4K0
VARCHAR 详解[通俗易懂]
In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data.
全栈程序员站长
2022/09/19
7040
DBbrain诊断日 | 这个匪夷所思的数据库故障,你会处理吗?
为更好的帮助DBA运维数据库,腾讯云将于每月12日在社群直播开展DBbrain诊断日,腾讯云高级产品经理迪B哥直播解析经典数据库运维难题,结合腾讯云数据库智能管家DBbrain的能力,为大家提供问题优化思路和方法,玩转数据库! 本期诊断日主要分享内容:数据库库表中的细节设计-数据类型相关案例。 在MySQL的使用和运维工作中,大家往往会把大量精力集中在如何优化慢SQL、如何设计数据库架构以及如何使用最佳时间的配置组合来提升数据库的访问性能上,但对于库表设计往往都比较随意。 其实良好的数据库逻辑设计和物理设
腾讯云数据库 TencentDB
2020/01/15
1.5K0
DBbrain诊断日 | 这个匪夷所思的数据库故障,你会处理吗?
【Mysql】varchar类型
(1)varchar (N):中的N指的是字符的长度,即:该字段最多能存储多少个字符(characters),不是字节数。不管是一个中英文字符或者数字、或者一个汉字,都当做一个字符。 【 a,我,1 都是一个字符,但是a和1是一个字节,‘我’(utf8下)是3个字节。 utf8mb4下:汉字也是3个字节,表情符号是4个字节 】 (2)varchar 最多能存储 65535 个字节的数据。 65535 = 所有字段的长度 + 变长字符的长度标识 + NULL标识位 变长字符的长度标识:用1到2个字节表示实际长度(长度 >255 时,需要2个字节; <255 时,需要1个字节) NULL标识位:varchar字段定义中带有 default null 允许列空,则需要 1 bit 来标识,每 8 个bits的标识组成一个字段。一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位。
用户5522200
2019/06/02
2.2K0
关于MySQL varchar类型最大值,原来一直都理解错了
关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~
架构精进之路
2020/09/28
2.3K0
关于MySQL varchar类型最大值,原来一直都理解错了
MySQL基础数据类型
  存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
changxin7
2022/05/06
5K0
MySQL基础数据类型
MySQL字段类型和字符集
5.存储空间利用高,仅存储实际字符数和少量长度信息,适用于存储长度差异较大的字符串数据
晚上不吃饭
2025/05/06
2770
相关推荐
一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验