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=302byte
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(N),N尽量小,为什么?
varchar(10)和varchar(100)为例子:
引擎层(磁盘存储与buffer pool)空间使用上两种是相同的;
server层处理数据时并非按照实际大小分配内存。
一些操作:排序、表DDL,varchar(100)会使用更多的磁盘和内存空间,效率会更低;
因为:server层并不知道引擎层数据是怎么组织的,各引擎组织方式肯定不一样,server层在分配内存时使用的是表定义时的长度,一些需要在server处理数据的操作都可能会受到影响!比如排序、加索引时会使用更多内存(tmp_table_size)或磁盘空间,性能受到影响。
4、int(11),给int指定长度有什么意义?
int(11)和int(4)为例子:
(1)int(11)和int(4)没有区别,只有在字段定义时加了zerofill属性,显示字段值时不足指定宽度会补0,但是zerofill几乎不用;