注册
学习笔记:达梦数据库 CHAR/VARCHAR 类型与常见数据库对比
技术分享/ 文章详情 /

学习笔记:达梦数据库 CHAR/VARCHAR 类型与常见数据库对比

vience 2023/08/03 2794 2 0

概述

基础概念

CHAR 类型:在存储时会占用固定的空间,无论实际存储的数据长度是多少,它都会占用固定的空间。如果定义一个 CHAR(10) 的列,无论实际存储的数据长度是 1 还是 10,它都会占用 10 个字节的存储空间。

VARCHAR 类型:在存储时会根据实际存储的数据长度来动态分配空间。与 CHAR 的区别为是否占用固定空间,如果定义一个 VARCHAR(10) 的列,实际存储的数据长度是 5,则它只会占用 5 个字节的存储空间。

差异性分析

CHAR 类型占用的存储空间固定,而 VARCHAR 类型根据实际存储的数据长度动态分配存储空间。由于 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 类型对象的长度是否以字符为单位。

  • 1:是,设置为以字符为单位时,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。同时,存储的字节长度8188上限仍然不变,也就是说,即使定义列长度为8188字符,其实际能插入的字符串占用总字节长度仍然不能超过8188;
  • 0:否,所有VARCHAR类型对象的长度以字节为单位
  • 缺省 值为 0

CHAR_FIX_STORAGE 定长字符(CHAR)是否按定长存储

  • Y/1:表示定长字符 CHAR 按定长存储即不允许 CHAR 变化为 VARCHAR2 进行存储;
  • N/0:表示定长字符 CHAR 按变长存储即允许 CHAR 变化为 VARCHAR2 进行存储。
  • 缺省 值为 N

存储空间与字符集

通常而言,使用 UTF-8 字符集存储文本时,单个中文需要使用 3 个字节的存储空间,在使用 CHAR(n) / VARCHAR(n) 生成列长度时,n 应当理解为字节数长度限制而非字符长度。

例如 MySQL 使用的 InnoDB 引擎将长度大于或等于 768 字节的固定长度字段按照可变长度字段进行编码并可以存储在页外。例如,如果字符集的最大字节长度大于 3(如 utf8mb4),那么 CHAR(255) 列可以超过 768 字节。

对于国内的应用而言,如果 DBMS 支持可以优先考虑 GB18030 字符集,即使用 GB 18030-2022 中文编码字符集的国家标准,此时一个中文字符采用两个字节存储,且支持几乎所有的中文生僻字。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服