mysql VARCHAR的最大长度到底是多少 |
本文标签:VARCHAR 以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的不过后来群里有人给了解释,突然才发现原来事情不是这么简单 MYSQL COMPACT格式,每条记录有一个字节来表示NULL字段分布,如果表中有字段允许为空,则最大只能定到65532,如果没有字段允许为空,则那个字节可以节省,最大可以定义到65533,不知道是不是这个原因 于是上网看了些资料,又在本地做了些实验,原来vachar的最大长度真的是不定的(根据是否有非空字段来决定) 在本地做了下实验,innodb+latin的环境 复制代码 代码如下: -- success drop table if exists test; create table test(name varchar(65533) not null)engine=innodb DEFAULT CHARSET=latin1 -- too large drop table if exists test; 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 复制代码 代码如下: name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1) name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1) name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1) name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte 总结一下,原来mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532 。 以下是其它网友的补充说明: 这不是一个固定的数字 。本文简要说明一下限制规则 。 strlen 计算字符串长度,一个中文当2字符 mb_strlen根据它的字符编码模式,统计字符quot count计算数组中的元素数目或对象中的属性个数 复制代码 代码如下: <?php header(Content-Type:text/html;charset=UTF-8); $string1="谢春业";//定义中文字符变量 $string2="xcy";//定义英文字符变量 //直接输出看看他们的长度 echo strlen($string1); echo "</br>"; echo strlen($string2); echo "</br>"; //用 php 多字节扩展函数 mb_strlen试试看 echo mb_strlen($string1,utf8); echo "</br>"; echo mb_strlen($string2,utf8); echo "</br>"; ?> 输出结果是: 9 3 3 3 1、限制规则 字段的限制在字段定义的时候有以下规则: a) 存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535 。 b) 编码长度限制 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845 。 对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节 。 若定义的时候超过上述限制,则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”了 。 |