北京SEO

MySQL下varchar类型最大长度是多少

2019/10/10/17:36:42  阅读:28056  来源:谷歌SEO算法  标签: 自媒体

在MySQL下varchar类型最大长度是多少呢,我们百度查一下会发现varchar长度为varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据了,那到底是不是这样的呢,我们来看看.

1、限制规则

字段的限制在字段定义的时候有以下规则:

a) 存储限制:varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度,长度超过255时需要2个字节,因此最大长度不能超过65535.

b) 编码长度限制:字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845,若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning.

c) 行长度限制:导致实际应用中varchar长度限制的是一个行定义的长度,MySQL要求一个行的定义长度不能超过65535,若定义的表长度超过这个值,则提示:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

2、计算例子,举两个例说明一下实际长度的计算.

a)若一个表只有一个varchar类型,如定义为:

create table t4(c varchar(N)) charset=gbk;

则此处N的最大值为(65535-1-2)/2= 32766,减1的原因是实际行存储从第二个字节开始’;减2的原因是varchar头部的2个字节表示长度;除2的原因是字符编码是gbk.

b) 若一个表定义为:

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812,减1和减2与上例相同;减4的原因是int类型的c占4个字节;减30*3的原因是char(30)占用90个字节,编码是utf8.

如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了.

上网看了些资料,又在本地做了些实验,原来vachar的最大长度真的是不定的,根据是否有非空字段来决定,在本地做了下实验,innodb+latin的环境.

  1. --success
  2. droptableifexiststest;
  3. createtabletest(namevarchar(65533)notnull)engine=innodbDEFAULTCHARSET=latin1
  4. --toolarge
  5. droptableifexiststest;

create table test(name varchar(65533))engine=innodb DEFAULT CHARSET=latin1

对于第二种情况,允许空字段的时候是不能加到65533的长度的,最大只能到65532,到底应该是引文的那种说法.

网上也有人做了类似的实验,参考:http://stackoverflow.com/questions/8295131/best-practise-for-sql-varchar-column-length

  1. namevarchar(100)notnullwillbe1byte(length)+upto100chars(latin1)
  2. namevarchar(500)notnullwillbe2bytes(length)+upto500chars(latin1)
  3. namevarchar(65533)notnullwillbe2bytes(length)+upto65533chars(latin1)
  4. namevarchar(65532)willbe2bytes(length)+upto65532chars(latin1)+1nullbyte //phpfensi.com

总结一下,原来mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533,不允许非空字段的时候,当允许非空字段的时候只能到65532.

2.CHAR(M), VARCHAR(M)不同之处

CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。

VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。

广告内容

MySQL下varchar类型最大长度是多少 MySQL下varchar类型最大长度是多少 MySQL下varchar类型最大长度是多少

相关阅读

热门评论

sunshine技术博客 sunshine技术博客

sunshine技术博客

总篇数164

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法