一、数据类型相关问题
1、varchar(N)占用多少空间
(1)varchar(N)里的N是字符数,而不是字节数;
(2)字符类型(varchar text blob等)空间=字符实际长度+字段长度;
(3)varchar(N)占用的空间:
如果是lantin1字符集时,最大空间=1N+(1 or 2)bytes,因为lantin1的1个字符占用1个字节,后面加的1或2bytes是用来表示字段长度的,当可能超过255个字节时,要2个bytes来表示字段长度;
如果是utf8字符集时,最大空间=3N+(1 or 3)bytes,因为utf8的1个字符占用3个字节,后面加的1或2bytes是用来表示字段长度的,当可能超过255字节时,要2个bytes来表示字段长度;
(4)当varchar(N)可能超过255字节时,字段长度=2;
例子:varchar(100)字符集为utf8时,’aaaa‘分别占用几个字节?
因为:varchar(100)如果存储中文的话,将占用3100 >225个字节,因此,需要2个字节来表示字段长度
’aaaa‘占用的空间=3100+2=302bytes
(5)补充:
2、char和varchar(N)类型的区别:
(1)char最大可表示255个字符,而varchar的总长度不能超过65535个字节(bytes),最大支持字符数根据字符集不同而不同;
(2)char会截掉尾部空字符串,而varchar不会截掉尾部空字符串;
(3)”char固定长度,varchar变长“这种说法对于innodb存储引擎是错误的。
innodb中是根据row_format来决定的:
除了redundant外,在处理多字节字符集(gbk utf8等)char字段时,innodb都会当成变长字符来处理,单字节的则仍然分配固定长度空间;也就是说,utf8 gbk字符集的char和varchar一致,都是变长的,而lantin1字符集的char类型是固定长度的。
【总结】
使用innodb存储引擎,对于常用的字符集gbk或utf8,char和varchar没区别,建议用varhcar类型。
3、varchar和text都可以表示长字符,且都是实际多少字符就占用多少空间,那需要存储多长字符串时,是选择varchar还是text呢?
(1)功能方面:
varchar长度有限制,所有char和varchar字段总和不能超过65535字节;且varchar可以有默认值。
而text类型最长可以存储4G,且text不能设置默认值;
【如何选择】
a、如果表中有太多长字段,可能无法将所有字段都建为varchar(例如,所有字段建立为varhcar大于65535字节的时候),可以结合varchar和text使用。
b、如果字段需要有默认值,那么使用varchar。
(2)性能方面:
有一种常见说法是“text字段是溢出字段,而varchar不会溢出,所以varchar更高效”======这种说法不完全对,因为text字段不一定溢出,只有当一整个行长度