CHAR 类型:在存储时会占用固定的空间,无论实际存储的数据长度是多少,它都会占用固定的空间。如果定义一个 CHAR(10)
的列,无论实际存储的数据长度是 1 还是 10,它都会占用 10 个字节的存储空间。
VARCHAR 类型:在存储时会根据实际存储的数据长度来动态分配空间。与 CHAR 的区别为是否占用固定空间,如果定义一个 VARCHAR(10)
的列,实际存储的数据长度是 5,则它只会占用 5 个字节的存储空间。
CHAR 类型占用的存储空间固定,而 VARCHAR 类型根据实际存储的数据长度动态分配存储空间。由于 Char 类型占用固定的存储空间,所以在存储短字符串时存在空间浪费,而 VARCHAR 类型在存储短字符串时可以节省存储空间。
由于 CHAR 类型占用固定的存储空间,所以在查询时比较快速。而 VARCHAR 类型由于需要动态分配存储空间,所以在查询时可能会稍微慢一些。
对于典型的 CHAR / VARCHAR 类型,其实际存储行为类似于下表:
Value | CHAR(4) | Storage Required | VARCHAR(4) | Storage Required |
---|---|---|---|---|
'' | ' ' | 4 bytes | '' | 1 byte |
'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
'abcdefgh' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
对于 CHAR / VARCHAR 最大存储空间限制,不同的数据库管理系统差异较大,这里长度单元都使用 byte 表述。
DBMS | CHAR | VARCHAR |
---|---|---|
MySQL | 255 | 65,535 |
Oracle | 2,000 | 4,000 |
Postgres | 10,485,760 | 10,485,760 |
DM | 8,188 | 8,188 |
对于 MySQL / Oracle 的使用场景 CHAR 类型在较短字符使用场景上对比 VARCHAR 有明确的性能优势。、
而对于 PostgreSQL 而言,CHAR 除了填充空白增了存储空间,没有性能差别,实际上因为额外的存储空间,CHAR 在 PostgreSQL 中反而是最慢的存储选项。
要注意 dminit 参数配置项 LENGTH_IN_CHAR 影响,它会决定 VARCHAR 类型对象的长度是否以字符为单位。
CHAR_FIX_STORAGE 定长字符(CHAR)是否按定长存储
通常而言,使用 UTF-8
字符集存储文本时,单个中文需要使用 3 个字节的存储空间,在使用 CHAR(n) / VARCHAR(n) 生成列长度时,n 应当理解为字节数长度限制而非字符长度。
例如 MySQL 使用的 InnoDB 引擎将长度大于或等于 768 字节的固定长度字段按照可变长度字段进行编码并可以存储在页外。例如,如果字符集的最大字节长度大于 3(如 utf8mb4
),那么 CHAR(255)
列可以超过 768 字节。
对于国内的应用而言,如果 DBMS 支持可以优先考虑 GB18030
字符集,即使用 GB 18030-2022
中文编码字符集的国家标准,此时一个中文字符采用两个字节存储,且支持几乎所有的中文生僻字。
文章
阅读量
获赞