《Mysql实例MySQL数据类型varchar详解》要点:

本文介绍了Mysql实例MySQL数据类型varchar详解,希望对您有用。如果有疑问,可以联系我们。1、varchar(N)的逻辑意义从MySQL4.1开始,varchar (N)中的N指的是该字段最多能存储多少个字符(characters),不是字节数.

不管是一个中英文字符或者数字、或者一个汉字,都当做一个字符.在4.1之前,N表示的是最大存储的字节数(bytes).

2、varchar(N)到底能存多长的数据

在mysql reference manual上,varchar最多能存储65535个字节的数据.varchar 的最大长度受限于最大行长度(max row size,65535bytes).65535并不是一个很精确的上限,可以继续缩小这个上限.65535个字节包括所有字段的长度,变长字段的长度标识(每个变长字段额外使用1或者2个字节记录实际数据长度)、NULL标识位的累计.

NULL标识位,如果varchar字段定义中带有default null允许列空,则需要需要1bit来标识,每8个bits的标识组成一个字段.一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位.

如果数据表只有一个varchar字段且该字段DEFAULT NULL,那么该varchar字段的最大长度为65532个字节,即65535-2-1=65532 bytes.

代码如下:

CREATE TABLE `vchar1` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `vchar2` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

如果数据表只有一个varchar字段且该字段NOT NULL,那么该varchar字段的最大长度为65533个字节,即65535-2=65533bytes.

代码如下:

CREATE TABLE `vchar3` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `vchar4` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

来个略微复杂点的表结构,->

代码如下:

CREATE TABLE `tv` (

`a` VARCHAR(100) DEFAULT NULL,

`b` VARCHAR(100) DEFAULT NULL,

`c` VARCHAR(100) DEFAULT NULL,

`d` VARCHAR(100) DEFAULT NULL,

`e` VARCHAR(100) DEFAULT NULL,

`f` VARCHAR(100) DEFAULT NULL,

`g` VARCHAR(100) DEFAULT NULL,

`h` VARCHAR(100) DEFAULT NULL,

`i` VARCHAR(N) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

`i` varchar(N) DEFAULT NULL中N最大值可以为多少?

这样计算:已知确定的字段长度为100*8  bytes,8个varchar(100)字段总共需要变长字段表示字节为1*8=8 bytes.每个NULL字段用1bit标识,9个字段都是default null,那么需要用(9+7)/8bit = 2 bytes存储NULL标识位.65535-100*8-1*8-2 = 64725 > 256,那么字段i的最大长度为64725  - 2 =64723 bytes,即N=64723 .

varchar到底能存多少个字符?这与使用的字符集相关,latin1、gbk、utf8编码存放一个字符分别需要占1、2、3个字节.

3、varchar物理存储

在物理存储上,varchar使用1到2个额外的字节表示实际存储的字符串长度(bytes).如果列的最大长度小于256个字节,用一个字节表示(标识).如果最大长度大于等于256,使用两个字节.

当选择的字符集为latin1,一个字符占用一个byte

varchar(255)存储一个字符,一共使用2个bytes物理空间存储数据实际数据长度和数据值.

varchar(256)存储一个字符,使用2 bytes表示实际数据长度,一共需要3 bytes物理存储空间.

varchar对于不同的RDBMS引擎,有不通的物理存储方式,虽然有统一的逻辑意义.对于mysql的不同存储引擎,其实现方法与数据的物理存放方式也不同.

4、InnoDB中的varchar

InnoDB中varchar的物理存储方式与InnoDB使用的innodb_file_format有关.早期的innodb_file_forma使用的Antelope文件格式,支持redundant和compact两种row_format.从5.5开始或者InnoDB1.1,可以使用一种新的file format,Barracuda.Barracuda兼容Redundant,另外还支持dynamic和compressed两种row_format.

当innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或者COMPACT.

innodb的聚集索引(cluster index)仅仅存储varchar、text、blob字段的前768个字节,多余的字节存储在一个独立的overflow page中,这个列也被称作off-page.768个字节前缀后面紧跟着20字节指针,指向overflow pages的位置.

另外,在innodb_file_format=Antelope情况下,InnoDB中最多能存储10个大字段(需要使用off-page存储).innodbd的默认page size为16KB,InnoDB单行的长度不能超过16k/2=8k个字节,(768+20)*10 < 8k.

当innodb_file_format=Barracuda,ROW_FORMAT=DYNAMIC 或者 COMPRESSED

innodb中所有的varchar、text、blob字段数据是否完全off-page存储,根据该字段的长度和整行的总长度而定.对off-page存储的列,cluster index中仅仅存储20字节的指针,指向实际的overflow page存储位置.如果单行的长度太大而不能完全适配cluster index page,innodb将会选择最长的列作为off-page存储,直到行的长度能够适配cluster index page.

5、MyISAM中的varchar

对于MyISAM引擎,varchar字段所有数据存储在数据行内(in-line).myisam表的row_format也影响到varchar的物理存储行为.

MyISAM的row_format可以通过create或者alter sql语句设为fixed和dynamic.另外可以通过myisampack生成row_format=compresse的存储格式.

当myisam表中不存在text或者blob类型的字段,那么可以把row_format设置为fixed(也可以为dynamic),否则只能为dynamic.

当表中存在varchar字段的时候,row_format可以设定为fixed或者dynamic.使用row_format=fixed存储varchar字段数据,浪费存储空间,varchar此时会定长存储.row_format为fixed和dynamic,varchar的物理实现方式也不同(可以查看源代码文件field.h和field.cc),因而myisam的row_format在fixed和dynamic之间发生转换的时候,varchar字段的物理存储方式也将会发生变化.

mysql varchar类型实例_Mysql实例MySQL数据类型varchar详解相关推荐

  1. mysql的存储过程原理_mysql存储过程原理与用法详解

    本文实例讲述了Mysql存储过程原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是存储过程 存储过程的创建 存储过程的使用 查看存储过程 修改存储过程 删除存储过程 首发日期:2018- ...

  2. mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解

    遇到故障,我们往往想的是如何解决这个故障,而不是从故障的根本去思考出现这个故障的原因?这样的结果,只能使我们得到了鱼,失去了渔.今天,我们就来分享一个由USE DB堵塞故障引发的思考案例. 故障描述 ...

  3. mysql函数编写格式_MySQL函数基础——字符串函数详解

    昨天,咱们对MySQL的数学函数进行了讲解,今天,咱们再来解析MySQL字符串函数. 字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数.字符串合并函数.字符串替 ...

  4. mysql 数值类型 长度_mysql中的数据类型的长度

    位,字节,字 --------------------------------------------------------------- 8位(bit)=1字节(Byte),1024字节=1KB: ...

  5. mysql 秒杀 隔离级别_MySQL 四种隔离级别详解,看完吊打面试官

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  6. mysql的更新用法_mysql update语句的用法详解

    本节内容: mysql数据库中的update语句. 首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr ...

  7. mysql 二叉树表设计_Mysql 索引模型 B+ 树详解

    一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...

  8. mysql delete limit用法_mysql delete limit 使用方法详解

    mysql delete limit优点: 用于DELETE的MySQL唯一的LIMIT row_count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值.本选项用于确保一个DELET ...

  9. mysql 8启动配置文件_mysql 启动配置文件my.cnf详解

    basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = path 从给定目录读取数据库文件 ...

  10. mysql event同步数据库_mysql 数据库Event定时任务使用详解(Navicat 及直接SQL语句创建)...

    /*-- ---------------------------- -- 先删除  alert_msg 数据库表数据 -- 再同步 alert_msg 更新相关数据 -- -------------- ...

最新文章

  1. html5父子页面数据传递,使用iframe标签嵌套页面时 如何进行父子页面通讯/传值...
  2. SDUT - 2609 A-Number and B-Number(二分+数位dp)
  3. python用语句输入一个3*3的二维矩阵_python中二维数组的建立,输入和输出
  4. Adobe Reader PDF 护眼设置
  5. [转载]Shell编程中的数组定义、遍历
  6. CSDN Blog升级通告
  7. 长方形旋转html5,HTML5/SVG旋转长方形来得到六边形图案
  8. 《WF编程》系列之29 - 本地通信事件:HandleExternalEventActivity 活动生成器
  9. 标准C语言第四版答案第十章,谭浩强C语言 第十章课后习题
  10. python查询ip归属地,Python查询IP地址归属完整代码
  11. howler 音频插件使用
  12. HART协议学习记录
  13. Bus Hound 使用指南
  14. Windows 10图标如何调整?
  15. 如果再来一次,你还会选择互联网么?
  16. 代码随想录第四天 leetcode 24、19、206
  17. CTF线下AWD攻防模式的准备工作及起手式
  18. Java面试题集(131-135)
  19. 安装Redhat 7.2
  20. springboot和kafka结合其中enable.auto.commit等于false失效

热门文章

  1. xml解析 java_Java的XML解析
  2. JavaMail实现邮箱激活功能
  3. vue滚动条禁止_js禁止和开启滚动条事件
  4. MySQL中MAX函数如何使用?
  5. PS抠图神器:KNOCKOUT 2.0汉化版下载及教程
  6. 齐博CMSV7任意文件读取漏洞批量测试POC
  7. Redis常见面试题你都掌握了没
  8. qsv格式爱奇艺视频知否如何转换成MP4格式
  9. 小米cc9pro普通版和尊享版的区别
  10. 手游服务器维护公告,10月28日服务器维护公告