mysql 取出char空格,MySQL CHAR和VARCHAR存储、读取时的差别

导读

你真的知道CHAR和VARCHAR类型在存储和读取时的区别吗?

还是先抛几条结论吧:

1、存储的时候,CHAR总是会补足空格后再存储,不管用户插入数据时尾部有没有包含空格。

2、存储的时候,VARCHAR不会先补足空格后再存储,但如果是用户在插入时特地加了空格那就会如实存储,而不会给删除。

3、读取数据时,CHAR总是会删除尾部空格(哪怕是写入时包含空格)。

4、读取数据时,VARCHAR总是如实取出之前存入的值(如果存储时尾部包含空格,就会继续保留着,不会像CHAR那样删除尾部空格)。

下面是测试验证过程。

1、测试CHAR类型

表结构:

插入几条记录:

查看存储结构:

看到这坨东西有点懵是不是,还记得我给你们安利过的一个工具不,看这里:innblock | InnoDB page观察利器。

可以看到,无论我们存储多长的字符串进去,每条记录实际都是占用43(169-126=43)字节。由此结论1成立。

简单说下,43字节的由来:

DB_TRX_ID, 6字节。

DB_ROLL_PTR, 7字节。

id, int, 4字节。

c1, char(20), 20字节;因为是CHAR类型,还需要额外1字节。

每条记录总是需要额外5字节头信息(row header)。

这样总的加起来就是43字节了。

再看下读取tchar表的结果:

2、测试VARCHAR类型

表结构:

插入几条记录:

查看存储结构:

可以看到,几条记录的字节数分别是:43、43、24、24、23、23(最后一条记录和id=5那条记录一样)。

对上面这个结果有点诧异是不是,尤其是id=1的记录(插入的是'a…后面19个空格'),居然也要消耗43字节,这就佐证了上面的结论2。

同样的,id=3和id=4这两条记录都是占用24字节,而id=5和id=6这两条记录都是占用23字节(没有额外存储字符串的字节数,只有id列4个字节)。

再看下读取tvarchar表的结果:

总的来说,可以总结成两条结论:

1、从读取的结果来看,CHAR类型列看起来像是在存储时把空格给吃了,但实际上只是在读取时才给吃了(显示层面上把空格删除了)。

2、从读取的结果来看,VARCHAR类型列看起来像是反倒保留了多余的空格,实际上也是只在读取时才恢复这些空格(但实际物理存储时还是会删掉这些空格)。

最后,来看下文档里怎么说的:

When CHAR values are stored, they are right-padded with spaces to the

specified length. 简言之,CHAR列在存储时尾部加空格补齐长度。

When CHAR values are retrieved, trailing spaces are removed unless the

PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.

简言之,CHAR列在读取时会去掉尾部空格,除非设置sql_mode值PAD_CHAR_TO_FULL_LENGTH=1。

VARCHAR values are not padded when they are stored.

简言之,存VARCHAR时尾部不加空格。

Trailing spaces are retained when values are stored and retrieved, in

conformance with standard SQL. 简言之,读取VARCHAR时会显示空格。

以上测试使用的版本及环境:

参考文档

以上就是MySQL CHAR和VARCHAR存储的差别的详细内容,更多关于MySQL CHAR和VARCHAR的资料请关注服务器之家其它相关文章!

原文链接:https://blog.p2hp.com/archives/6616

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值