mysql关于数据类型的相关问题

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字符集时,最大空间=3
N+(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‘占用的空间=3
100+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几乎不用; 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值