MySQL char 尾随空格丢失与右侧空格填充

        今天看《高性能MySQL(第四版)》,讲char,varchar时说“当存储CHAR值时,MySQL删除所有尾随空格。如果需要进行比较,值会用空格填充。”感觉这两句话有冲突啊,便研究了下。

        对于具体的问题,当然官方文档是最好的,The CHAR and VARCHAR Types,推荐阅读全文。

        原来并不是“如果需要进行比较”,而是因为是定长,会用空格填充。

        那么就想到了一个问题,为什么要填充。为什么用空格填充。网上没找到相关资料,我试着回答下(就是猜的)


为什么填充:

        以char(10)为例,这里的10指10个字符,char(10)到底占用多少磁盘空间,和字符集有关。因为是固定长度,已经分配了这么多空间。如果不填充,就会造成磁盘碎片问题,不连续。


为什么用空格填充:
        char类型存储的是字符而不是字节。分配固定长度之后,空余部分肯定要存贮当前字符集中的某个字符,逻辑上讲用空格填充应该是最合适的。也不能用“00***00”,因为“00***00”在当前字符集中可能不是任何字符,即便是某个字符,也不如用空格表示更合理。

        右侧用空格填充,那么原本插入值右侧的空格和填充的空格就分不清了,就会有右侧空格丢失的问题。


固定长度有什么好处呢:
1、对于经常修改的数据,VARCHAR容易出现碎片(长变短),还可能有重建记录、页分裂的开销(短变长)。固定长度就不会有这个问题。

2、对于非常短的列,CHAR也比VARCHAR更高效。设计为只保存Y和N的值的CHAR(1)在单字节字符集中只使用1字节,但VARCHAR(1)需要2字节,因为还有一个记录长度的额外字节。
 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值