首页 > 数据库 >MySQL - varchar(N) 的N代表什么?怎么存储?

MySQL - varchar(N) 的N代表什么?怎么存储?

时间:2024-04-08 15:14:54浏览次数:28  
标签:存储 varchar 字节 32 占用 MySQL 长度

varchar(N) 的N代表什么?

N代表“字符”

varchar(32)表示:可以存储 32 个字符,包括中文和其他字符。

跟中英文无关,也就是该字段可以存储 32 个中文,或者是 32 个英文,或者是 32 个中文和英文的混搭都行。但如果字符数超过 32 个的话就会报错。

参考:什么是字符?什么是字节?

 

原文内容

计算varchar列的长度

varchar类型除了存储字符串本身以外,还需要1~2个字节来存储字符串的长度信息(字符串长度小于或等于255字节时需要1字节,超过则需要2字节);另外,如果设置允许NULL的话,会再需要多1字节空间。
假设有一个varchar(32)字段,字符集是utf8,允许NULL,因为每个utf8字符最多占用3个字节,存储字符串本身需要占用的空间是:32 * 3 = 96字节
96字节小于255,所以这一列的最大长度是:
96 + 1(存储长度信息的额外1字节) + 1(允许NULL的1字节) = 98字节

varchar(N)中的N最大能设置为多少

由于MySQL限制了每一行的数据最大长度为65535字节(不包括TEXT类型和BLOB类型的字段),无论用的是什么存储引擎,都不能突破这个限制。因此这个N的计算公式为:

(65535 - 其它字段占用的字节数 - varchar存储长度信息的额外字节数 - 允许NULL的额外字节数) / 每个字符需要占用的字节数
1
举个例子,我们要在一个表中新增一个varchar字段,字符集是utf8mb4,允许NULL。其它字段总共已占用了1000字节,直接套公式,得出N最大值为:
(65535 - 1000 - 2 - 1) / 4 = 16133

InnoDB引擎每一行记录的最大长度是多少

InnoDB每一个数据页的大小默认是16KB,每一页至少要存2行数据,除去一些页头等额外需要占用的空间,InnoDB每一行记录能使用的最大空间约为8KB,实际值是8126字节。

既然每一行最多只能占用8126个字节,那为什么上面的例子中,N可以设置为16133个字符呢?每个字符4字节,已经是16133 * 4 = 64532字节了,远远超出8126。这里是因为,对于可变长的列,如果长度超过了8126,InnoDB会把列数据存储在溢出页上,而不是存储在数据页里,数据页仅保留一个20字节的指针,用于指向数据所在的溢出页(Off Page)。


因此,对于这些超长的字符串字段,数据库在查询的时候,除了要查询数据页的数据以外,还要另外查询溢出页,增加了磁盘IO,会对性能有一定的影响,这也是不建议 SELECT * 的原因之一,而且查询所有字段也会更加占用内存。

varchar(5)和varchar(200)有区别吗

虽然varchar(5)和varchar(200)在存储空间上的开销是一样的,但使用更大的长度有以下缺点:
1)上面说到,每一行记录最多只能占用65535字节,如果varchar定义得太大,留给后续新加字段使用的空间就越少
2)建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(200)建立的索引存储大小要比varchar(5)建立索引存储大小大得多,加载索引使用的内存也更多
3)使用临时表进行排序时,会占用更多的空间。

因此最好的策略是按照真实需要来设置长度。

参考文献

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ljfrocky/article/details/117932283

 

标签:存储,varchar,字节,32,占用,MySQL,长度
From: https://www.cnblogs.com/frankcui/p/18121183

相关文章

  • 探究MySQL8.0驱动的加载
    探究MySQL8.0驱动的加载大家在连接mysql的时候,启动项目,会警告你推荐使用com.mysql.cj.jdbc.Driver而不是com.mysql.jdbc.Driver那么这两者到底有什么区别呢本质区别:com.mysql.jdbc.Driver是mysql-connector-java5中的,需要手动加载驱动com.mysql.cj.jdbc.Driver是mysql......
  • MySQL学习路线一条龙
    引言在当前的IT行业,无论是校园招聘还是社会招聘,MySQL的重要性不言而喻。面试过程中,MySQL相关的问题经常出现,这不仅因为它是最流行的关系型数据库之一,而且在日常的软件开发中,MySQL的应用广泛,尤其是对于Java后端开发者来说,熟练掌握MySQL已成为他们技术能力评估的重要指标。因此,My......
  • Web API(五)之BOM操作&window对象&本地存储
    WebAPI(五)之BOM操作&window对象&本地存储js组成window对象定时器-延迟函数JS执行机制location对象navigator对象histroy对象本地存储localStoragesessionStorage(了解)localStorage存储复杂数据类型综合案例数组map方法数组join方法js组成JavaScript的组成ECMA......
  • python计算机毕设【附源码】基于Android开发的智能音乐播放系统(django+mysql+论文)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着移动互联网的飞速发展,智能手机已经成为人们日常生活中不可或缺的一部分。在众多手机应用中,音乐播放系统是用户使用频率较高的应用之一。传统的音乐播放......
  • 基于springboot+vue+Mysql的学习平台
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示平台首页用户注册课程信息作业信息资料信息个人中心管理员功能界面学生管理教师管理课程......
  • MySQL分组查询以及having筛选
    DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(......
  • MySQL分组查询以及having筛选
    DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(......
  • MySQL多表联合查询、聚合函数
    1、DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyin......
  • 基于SSM+Jsp+Mysql的汽车在线销售系统
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示网站首页车辆信息管理员登录用户信息管理车辆信息管理出库记录管理入库记录管理车辆购买管理......
  • MYSQL多表联合查询
    DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(......