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字节,因为还有一个记录长度的额外字节。
 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 22:24:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 22:24:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 22:24:02       87 阅读
  4. Python语言-面向对象

    2023-12-14 22:24:02       96 阅读

热门阅读

  1. 读懂死锁日志

    2023-12-14 22:24:02       64 阅读
  2. GAMES101-作业0

    2023-12-14 22:24:02       66 阅读
  3. zk_dubbo

    zk_dubbo

    2023-12-14 22:24:02      63 阅读
  4. (第17天)RMAN 冷备异机恢复 Oracle 数据库

    2023-12-14 22:24:02       57 阅读
  5. Oracle 慢查询排查步骤

    2023-12-14 22:24:02       49 阅读