mysql中的varchar_从数据类型varchar转化为

mysql中的varchar_从数据类型varchar转化为MySQL数据类型varchar详解更新时间:2014年03月17日11:10:11作者:这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM中的varchar等问题,需要的朋友可以参考下1、varchar(N)的逻辑意义从MySQL4.1开始,varchar(N)中的N指的是该字段最多能存储多少个字符(characters…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

MySQL数据类型varchar详解

更新时间:2014年03月17日 11:10:11   作者:

这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM中的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字段的物理存储方式也将会发生变化。

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了Suse Linux 10中MySql安装与配置步骤,本文详细的讲解了安装步骤,需要的朋友可以参考下2015-05-05

4f55910a645b073bc4fc65dc10dc14bd.png

这篇文章主要介绍了 linux下安装mysql简单的方法,需要的朋友可以参考下2017-08-08

0ea3c7666119d5615e582f823fb3fad6.png

有时候我们需要远程连接mysql数据库,就需要注意下面的问题,方便大家解决,脚本之家小编特为大家准备了一些资料2012-07-07

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要为大家详细介绍了win2008下mysql8.0.11升级mysql8.0.17版本详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-08-08

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要介绍了mysql双向加密解密方式用法,需要的朋友可以参考下2014-04-04

0c932a99bb7b6f23c937db507070cc7b.png

这篇文章主要为大家详细介绍了Centos7下mysql 8.0.15 安装配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-03-03

cca732bf65a93ed2ec0ac80c638460fe.png

这篇文章主要介绍了MySQL为什么要避免大事务以及大事务解决的方法,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下2020-08-08

2d9f31f2af7b675a3d153d2b7f1035a7.png

这篇文章主要介绍了mysql5.6.21安装与配置的详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03

b452cee8ec5cd9e58ab98eba17281e59.png

这篇文章主要介绍了Innodb存储引擎索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04

f4838ec7e2d4da28e0b57d4e852dadd4.png

这篇文章主要介绍了mysql如何利用Navicat导出和导入数据库的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-02-02

最新评论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193732.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android系统中toast是什么_android studio toast不显示

    android系统中toast是什么_android studio toast不显示Toast控件介绍Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息,它显示在应用程序界面的最上层,显示一段时间后自动消失不会打断当前操作,也不获得焦点。使用Toast提示信息的实例代码:Toast.makeText(Context,Text,Time),show();这段代码首先调用了Toast的makeText方法用来设置提示信息,Context:表示应用程序环境的信息,就是当前组件的上下文环境,如果在Activity中使用的话,那么该参数可设置为”Activi

    2022年9月13日
    2
  • python 之字符编码

    一了解字符编码的储备知识python解释器和文件本编辑的异同相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样不同点:文本编辑器

    2022年3月29日
    49
  • PLSQL developer使用技巧「建议收藏」

    PLSQL developer使用技巧「建议收藏」1.调整字体PLSQLDeveloper的默认字体是大小是小五,看起来比较小。我们可以通过以下方式将字体改编为五号字体。工具-首选项-用户界面-字体-浏览器(编辑器、表格)-选择-大小五号。2.文本替换文本替换可以极大提高我们敲写SQL的效率。替换方式如下:工具-首选项-用户界面-编辑器-自动替换-选择文件如下,提供一个简单的模板。sf

    2022年6月7日
    59
  • mysql中的enum是什么类型_数据库枚举类型是什么

    mysql中的enum是什么类型_数据库枚举类型是什么为什么使用枚举限定值的取值范围,比如性别(男,女,未知)等。枚举类型使用陷阱超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’;解释1:你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错解释2:enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错;如果你使用‘

    2025年9月17日
    4
  • oracle 查看服务器密码修改,如何修改oracle用户密码「建议收藏」

    oracle 查看服务器密码修改,如何修改oracle用户密码「建议收藏」修改oracle用户密码的方法:首先连接oracle数据库所在服务器,并进入oracle控制台;然后输入“selectusernamefromdba_users”查看用户列表;最后输入修改用户口令即可。本教程操作环境:windows7系统、oracle版,DELLG3电脑。修改oracle用户密码的方法:1、用CRT以安装oracle数据库的用户连接oracle数据库所在服务器。(以服务…

    2022年7月28日
    5
  • 实战 | SpringBoot微信点餐系统(附源码)[通俗易懂]

    实战 | SpringBoot微信点餐系统(附源码)[通俗易懂]点击上方“java进阶架构师”,选择右上角“置顶公众号”20大进阶架构专题每日送达架构前后端分离:补充:setting.xml文件的作用:settings.xml是ma…

    2022年4月19日
    188

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号