百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

InnoDB行格式(3)VARCHAR最多能存储的数据

nanshan 2024-10-13 03:53 13 浏览 0 评论

InnoDB存储引擎VARCHAR最多能存储的数据

前言

我们知道在InnoDB存储引擎中,行格式Compact、Compressed、Dynamic都会计算变长字段VARCHAR长度列表,这个字段长度一般采用两个字节表示,也就是VARCHAR能表示的最大长度应该是2的16次方(因为一个字节8位,两个字节16位能表示的最大值是65535),那么65535个字节长度是否能存放呢?测试案例如下

mysql> create table test_varchar_size(
    -> c varchar(65535)
    -> )CHARSET=ascii ROW_FORMAT=Compact;
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

分析

很明显错误信息提示,我们列c设置的长度太长,注意MySQL对一条记录占用最大的空间有限制,所有列(不包含隐藏列和记录头信息)长度之和需要小于65535,当然这并不包含TEXT或者BLOBs类型的列。也就是说test_varchar_size测试表还有其它数据占据空间,我们先来分析一条数据的基本信息,以Compact行格式为例

这里的长度不计算记录头信息以及隐藏列那么还剩下如下三部分数据

  • 字段的真实数据。
  • 字段的长度数据。
  • 字段的NULL值列表。

ascii字符集

字段的长度数据也就是长度列表最大两个字节,字段c没有指明not null所以占用一个字节(只有一个字段其实只占用了一个bit位,但需要用一整个字节表示所以高位补0),而test_varchar_size测试表的的字符集为ascii,只需要用一个字节就可以表示一个字符,其余编码集可以参考如下数据。

### 查询所有的字符集,总共有41种下面抽取常见字符集
### Maxlen表示一个字符最大需要几个字节表示
mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
.......
+----------+---------------------------------+---------------------+--------+

所以采用ascii的测试表test_varchar_size唯一c字段长度应该为

65535 - 2(变长字符长度列表)-1(NULL值列表)= 65532

mysql> create table test_varchar_size(
    -> c varchar(65532)
    -> )CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.01 sec)

在上面分析中我们提到了字符集影响字段c的最大长度,那么非ascii是如何影响的呢?往下面走

gbk字符集

通过show charset like '%gbk%';命令我们可以得到gbk一个字符最大需要两个字节才能表示,演示如下

mysql> show charset like '%gbk%';
+---------+------------------------+-------------------+--------+
| Charset | Description            | Default collation | Maxlen |
+---------+------------------------+-------------------+--------+
| gbk     | GBK Simplified Chinese | gbk_chinese_ci    |      2 |
+---------+------------------------+-------------------+--------+
1 row in set (0.00 sec)

那么采用gbk字符c字段能表示的最大长度应该为

65535 - 2(变长字符长度列表)-1(NULL值列表)= 65532

65532 / 2 = 32766

结果验证如下

mysql> create table test_varchar_size(
    -> c varchar(32767)
    -> )CHARSET=gbk ROW_FORMAT=Compact;
ERROR 1118 (42000): Row size too large. The maximum row size 
for the used table type, not counting BLOBs.......
mysql> create table test_varchar_size(
    -> c varchar(32766)
    -> )CHARSET=gbk ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.01 sec)

utf8字符集

utf8字符集验证和gbk字符集验证类似,因为utf8一个字符需要三个字节表示,所以c字段能表示的最大长度就是

65532 / 3 = 21844

注意

上面分析时只采用了一个字段,并且字段c是允许为空的,就直接采用上面的规则分析,如果c字段设置了NOT NULL那么就不需要65535-1的操作,实际分析时需要根据情况具体分析。

相关推荐

SpringBoot实现的简单停车位管理系统附带导入和演示教程视频

这一次为大家带来的是简单的停车位管理系统,基于SpringBoot+Thymeleaf+Mybatis框架,这个系统相对来说比较简单,很容易学习并快速上手,因为逻辑很清晰,没有太复杂的代码逻辑,所以学...

一个开箱即用的代码生成器(代码自动生成工具开源)

今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...

【免费开源】JeecgBoot单点登录源码全部开源了

JeecgBoot单点登录源码全部开源了,有需要的朋友可以来薅羊毛了。一、JeecgBoot介绍JeecgBoot是一款企业级的低代码平台!前后端分离架构SpringBoot2.x,SpringCl...

SpringBoot+JWT+Shiro+Mybatis实现Restful快速开发后端脚手架

作者:lywJee来源:cnblogs.com/lywJ/p/11252064.html一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置...

为什么越来越多的人选择使用idea软件

IDEA软件是什么?IDEA软件是干什么的?为什么越来越多的人选择使用IDEA软件?IDEA软件,全称IntelliJIDEA,它是由JetBrains公司开发开发的一款功能强大的集成开发环境(ID...

开题报告大学生互助系统(附源码)java毕设

本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,大学生群体对信息共享与互助的需求日益增长。关于大...

SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!

项目简介及系统架构JeecgBoot是一款基于SpringBoot的开发平台,它采用前后端分离架构,集成的框架有SpringBoot2.x、SpringCloud、AntDesignof...

新手配电脑13代CPU怎么选择(新手配电脑13代cpu怎么选择好)

Intel第13代酷睿i3、i5、i7、i9系列处理器的核心参数、性能差异及适用群体的详细说明(以桌面端为例):一、13代酷睿全系参数对比(桌面端主流型号)参数i3-13100i5-13600Ki7-...

加速 SpringBoot 应用开发,官方热部署神器真带劲

平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效。如果你的应用足够大的话,启动可能需要好几分钟。有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp...

基于微信小程序的移动端物流系统-计算机毕业设计源码+LW文档

摘要随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理移动端物流系统app的最新形式。本论文是以构建移动端物流系...

springboot教务管理系统+微信小程序云开发附带源码

今天给大家分享的程序是基于springboot的管理,前端是小程序,系统非常的nice,不管是学习还是毕设都非常的靠谱。本系统主要分为pc端后台管理和微信小程序端,pc端有三个角色:管理员、学生、教师...

SpringBoot全家桶:23篇博客加23个可运行项目让你对它了如指掌

SpringBoot现在已经成为Java开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通...

Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统

本系统基于Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统。简单实现了充值、购买歌曲、poi数据导入导出、歌曲上传下载、歌曲播放、用户注册登录注销等功能。难度等级:简单技术...

Java本地搭建宝塔部署实战SSM房屋租赁系统源码

大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套Java开发的SSM房屋租赁系统的源码。技术架构技术框架:HTML+CSS+JavaScript+jsp+mysql+S...

SSM+Jsp+Mysql实现的在线考试系统附带源码运行视频

项目是基于SSM框架所开发一款在线考试系统,目前只有三种试题,单选、多选、简答,系统项目源码在【猿来入此】获取!后台有教师和管理员两种角色、前台学生自主注册功能有:在线考试、历史回顾、个人成绩查询等。...

取消回复欢迎 发表评论: