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

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

wptr33 2024-12-26 17:07 17 浏览

我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“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!

    相关推荐

    【推荐】一款开源免费、美观实用的后台管理系统模版

    如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

    Android架构组件-App架构指南,你还不收藏嘛

    本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

    高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

    使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

    flutter系列之:UI layout简介(flutter ui设计)

    简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

    Android开发基础入门(一):UI与基础控件

    Android基础入门前言:...

    iOS的布局体系-流式布局MyFlowLayout

    iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

    TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

    TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

    WinForm实现窗体自适应缩放(winform窗口缩放)

    众所周知,...

    winform项目——仿QQ即时通讯程序03:搭建登录界面

    上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

    App自动化测试|原生app元素定位方法

    元素定位方法介绍及应用Appium方法定位原生app元素...

    61.C# TableLayoutPanel控件(c# tabcontrol)

    摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

    想要深入学习Android性能优化?看完这篇直接让你一步到位

    ...

    12个python数据处理常用内置函数(python 的内置函数)

    在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

    如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

    假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

    Python入门知识点总结,Python三大数据类型、数据结构、控制流

    Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...