网站首页 > 教程分享 正文
我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“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).
大概意思就是说:
按照官网说法最大值是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!
猜你喜欢
- 2025-03-26 程序编码优化-JAVA篇(java 编译器优化)
- 2025-03-26 4款实用强大的下载器(比较好的下载器)
- 2025-03-26 自从学了深入解析java虚拟机:FullGC和字符串去重后,我无敌了
- 2025-03-26 将安卓手机打造成你的 Python 开发利器
- 2025-03-26 自动化安装SaltStack,开启自动化运维之路
- 2025-03-26 如何在 MySQL 中设置默认的字符集和排序规则
- 2025-03-26 MySQL 9.1正式发布,有哪些值得关注的新特性?
- 2025-03-26 Qt之读写文件(qt读写文本文件)
- 2025-03-26 火狐浏览器Firefox34.0 Beta 3发布
- 2025-03-26 MySQL 5.7 vs MySQL 8.0 高频面试题解析
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)