Oracle 字符类型对比

发布于:2025-03-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

本文以 Oracle12c 为例

1.主要区别对比

类型 存储方式 最大长度 字符集支持 适用场景 备注
CHAR(M) 固定长度+空格填充 2000 字节,M 代表字节长度 默认字符集 固定长度编码 实际存储长度固定为定义长度(如 CHAR(10) 始终占 10 字节)
VARCHAR2(M) 可变长度 4000 字节,M 默认代表字节长度 默认字符集 可变长度文本 标准模式下最大为 4000 字节,扩展模式可到 32767 字节(需手动启用)
NCHAR(M) 固定长度+空格填充 2000 字符,M 代表字符长度 国家字符集 多语言固定长度文本 M 支持的长度受字符集影响
NVARCHAR2(M) 可变长度 4000 字节,M 代表字符长度 国家字符集 多语言可变长度文本 M 支持的长度受字符集影响
CLOB 大文本 4GB 数默认字符集 超大单字节文本(如日志、XML) 实际存储受表空间和数据块限制
NCLOB 大文本 4GB 国家字符集 超大多语言文本 实际存储受表空间和数据块限制

VARCHAR 类型在 Oracle 中支持有限,不建议使用。

类型前缀为 “N” 代表使用的是国家字符集,且字符存储时采用 Unicode,且在多语言情况下相同字符所需的存储空间可能更小。

类型前缀不带 “N” 代表采用数据库默认的字符集,可能会导致字符存储时不采用 Unicode 编码方式。但一般数据库默认的字符集都是 UTF8 类型的。因此一般用不带 “N” 的类型就可以了。

前缀带 “N” 的类型长度 M 代表的都是字符长度,不带 “N” 的类型长度 M 默认都是指字节长度

查看当前数据库默认字符集和国家字符集的方式如下:

-- 查看数据库字符集(默认字符集)、国家字符集
SELECT *
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

输出为:
在这里插入图片描述
可以看到此时默认字符集为 AL32UTF8,国家字符集为 AL16UTF16。

​数据库默认字符集:

  • AL32UTF8:Unicode UTF-8(Unicode 5.0+(新标准))。
  • ZHS16GBK:简体中文 GBK 编码。
  • WE8MSWIN1252:西欧字符集。

​国家字符集:

  • AL16UTF16:Unicode UTF-16。
  • UTF8:Unicode UTF-8(Unicode 3.1(旧标准))。

2.补充

上文提到,字符类型长度 M 能指定的最大值与数据集相关。比如在多字节字符集(如 AL16UTF16),建表时用 NVARCHAR2(4000) 会报错,可能原因是超过了最大字节长度 4000。

此外,M 能指定的最大长度还与“数据库块大小(默认 8KB)”、“数据库是否开启扩展模式” 等因素有关。

-- 查看块大小
SELECT value AS "块大小 (字节)"
FROM v$parameter
WHERE name = 'db_block_size';

-- 查看扩展模式
SELECT value AS "扩展模式"
FROM v$parameter
WHERE name = 'max_string_size';