mysql没有主键不能更新数据类型_20160924-2——mysql常见问题集锦 一、数据类型相关问题...

一、数据类型相关问题

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)补充:

b7d2a3babea7a334e447a3ab40db9a3b.png

3b3ed49e1c15dac31338645c92c55dda.png

2、char和varchar(N)类型的区别:

(1)char最大可表示255个字符,而varchar的总长度不能超过65535个字节(bytes),最大支持字符数根据字符集不同而不同;

(2)char会截掉尾部空字符串,而varchar不会截掉尾部空字符串;

(3)”char固定长度,varchar变长“这种说法对于innodb存储引擎是错误的。

innodb中是根据row_format来决定的:

6b6560524f1875202fc8c6d989142c64.png 

除了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字段不一定溢出,只有当一整个行长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值