MySQL中varchar最大长度是多少?sql
一. varchar存储规则:编码
4.0版本如下,varchar(20),指的是20字节,若是存放UTF8汉字时,只能存6个(每一个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,不管存放的是数字、字母仍是UTF8汉字(每一个汉字3字节),均可以存放20个,最大大小是65532字节 Mysql4中最大也不过是20个字节,可是Mysql5根据编码不一样,存储大小也不一样。 spa
二. varchar和char 的区别:索引
char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视状况来处理,若是是严格模式,则会拒绝插入并提示错误信息,若是是宽松模式,则会截取而后插入。若是插入的字符串长度小于定义长度时,则会以不一样的方式来处理,如char(10),表示存储的是10个字符,不管你插入的是多少,都是10个,若是少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。 varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来讲,须要使用一个(若是字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。可是由于他须要有一个prefix来表示他具体bytes数是多少(由于varchar是变长的,没有这个长度值他不知道如何读取数据)。字符串
对 char 来讲,最多能存放的字符个数 255,和编码无关。 而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由最大行大小和使用的字符集肯定。总体最大长度是 65,532字节字符编码
在MySQL中用来判断是否须要进行对据列类型转换的规则table
一、在一个数据表里,若是每个数据列的长度都是固定的,那么每个数据行的长度也将是固定的.class
二、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.sed
三、若是某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.例外:长度小于4个字符的char数据列不会被转换varchar类型im
三. MySQL中varchar最大长度是多少?
这不是一个固定的数字。先简要说明一下限制规则。
一、限制规则
字段的限制在字段定义的时候有如下规则:
a) 存储限制
varchar 字段是将实际内容单独存储在聚簇索引以外,内容开头用1到2个字节表示实际长度(长度超过255时须要2个字节),所以最大长度不能超过65535字符。
b) 编码长度限制
字符类型若为gbk,每一个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每一个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
c) 行长度限制
致使实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535bytes。若定义的表长度超过这个值,则提示
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。
由字符集来肯定,字符集分单字节和多字节 Latin1 一个字符占一个字节,最多能存放 65532 个字符 GBK 一个字符占两个字节, 最多能存 32766 个字符 UTF8 一个字符占三个字节, 最多能存 21844 个字符 注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。
二、计算例子
举两个例说明一下实际长度的计算。
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”了。
则此处N的最大值为 (65535-1-2-4-30*3)/3=21812
create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8