Oracle 字符类型对比

发布于:2025-03-11 ⋅ 阅读:(328) ⋅ 点赞:(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';

微信公众号

今日签到

点亮在社区的每一天
去签到