以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的不过后来群里有人给了解释,突然才发现原来事情不是这么简单
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