顶部左侧内容
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 在线教程 > 正文

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

gosiye 2024-09-27 10:18 1 浏览 0 评论

我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。

写在前面

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

    65535/4=16383.75

    实践验证

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

    我们来实验下试试看?

    mysql 版本:
    select version(); // 5.7

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

    定义如下:

    CREATETABLE`t1` (  
      `c`varchar(N) DEFAULTNULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

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


    实践出真知,可以简单试一下之后再下结论,希望本文对你有所帮助~


    - END -


    作者:架构精进之路,专注软件架构研究,技术学习与个人成长,关注并私信我回复“01”,送你一份程序员成长进阶大礼包。



    Thanks for reading!

    相关推荐

    全球最大的H5网站模板库(h5页面模板下载)

    当今社会,互联网迅猛发展,在网络营销中,客户往往通过企业的网站建设留下对该企业的第一印象,一个优秀的企业网站已成为企业发展的重要纽带,嗨创H5,拥有国内外一流的技术团队,潜心专研网站建设6年,是全球最...

    wordpress集团公司网站模板:XSgr(wordpress建站公司)

    小兽wordpress推出一款高端集团公司主题,打造高品质官网。高端是一种态度和坚持,因为我坚信贴合产品及品牌理念的高端深度定制才能最大化地呈现企业的务实严谨与产品的专业品质相比,某种程度上讲–...

    私心推荐,小编酷爱的五款高逼格网站模板

    建站宝盒的网站模板上千套之多,各有各的风格色彩,但是,弱水三千,小编我却只取一瓢饮,在这上千套模板之中,小编酷爱的网站模板有五套,让小编私心推荐一下吧!1、茶叶贸易公司网站模板小编对这款网站模板可是一...

    「书讯」政府网站用户行为研究与应用

    《政府网站用户行为研究与应用》作者:刘合翔著出版日期:2018年6月开本:16开出版社:经济管理出版社小编推荐《政府网站用户行为研究与应用》的主题是关于政府网站用户行为的特征规律及其在政府网站优...

    免费服务器-搭建模板网站的操作流程(图文版)

    之前发文《创业者的官网:如何搭建免费云服务器及操作面板(图文版)》,因为做了视频才发现,创业者对视频的需求,远远低于对图文解说的需求。因此,补充图文教程,不清楚的看官们,可以直接看视频版本进行细部学...

    快收藏这些高逼格H5网站模板吧,不绕弯子直接下载

    上面这些响应式H5网站是不是很炫酷,比起那些“在线一键生成”是不是好太多了?关键是,那些一键制作都不会开放源码给你,自定义性也很局限。不过说到底还是难看。今天笔者推荐大家一个模板网站,全都是高质量的响...

    如何开发网站建设管理系统模板(如何开发网站建设管理系统模板图片)

    根据用户网站需求文档设计美工图,并设计数据库结构,让网站开发人员可以更多地关注前台美工,先对照美工图,编写静态HTML页面,按网站建设管理系统模板语法,修改编写好的静态HTML页面,运行。不再需要对...

    C语言的数据类型介绍(c语言的数据类型介绍是什么)

    在计算机系统中,数据是放在内存中的,数字、文字、符号、图形、音频、视频等数据都是以二进制形式存储在内存中的,它们并没有本质上的区别,那么0001000该理解为数字8呢,还是图像中某个像素的颜色...

    C 语言格式化输出函数中常用的格式符号

    在之前介绍输入输出函数的文章中,有提到格式化输入输出函数都有包含一种特殊的符号——格式符号。那篇文章中关于格式符号也只是一笔带过,没有进行深入挖掘。本篇文章主要对输出函数(printf)中的一些常用格...

    C#中的类型转换(c#数据转换类)

    计算机存储的基本单位:字节我们知道一个字节(Byte)有8个比特(bit)构成,比特是存储的最小单位,表示0和1,但为什么计算机存储的基本单位是字节,而不是比特呢?假设我们要存储数字3(二进制:11...

    Java8中String内存空间占用分析(电脑里下载的文件怎样删除才不会占用内存空间)

    1.前言分析之前,简单回顾一下对象的内存分布。在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三部分:对象头、实例数据和对齐填充。对象头包含两部分内容:MarkWord和类型指针。实例数据...

    「每日C语言」数据类型大小和取值范围

    对于c语言来说,数据类型是一个很重要的概念和知识点,它涉及到的是内存的空间,这在和硬件交互的时候是非常重要的。K&R给出了7个数据类型相关的关键字,分别是:int、long、short、uns...

    【c语言学习笔记】数据类型(c语言里面的数据类型)

    c语言学习笔记,欢迎大家能在评论区提出我学习错误的地方方便我进行改正~在计算机中,计算机用二进制来储存数据,在c语言中有许多的数据类型用来存储数据,当然不同的数据类型所用的内存占用也不一样,下面就来用...

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

    我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。写在前面关于MySQLvarchar字段类型的最大值计算,也许我们一直都理解错误了,...

    C语言数据类型的转换(c语言数据类型的转换方式)

    类型转换在C语言程序中,经常需要对不同类型的数据进行运算,为了解决数据类型不一致的问题,需要对数据的类型进行转换。例如一个浮点数和一个整数相加,必须先将两个数转换成同一类型。C语言程序中的类型...

    取消回复欢迎 发表评论: