本文以 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';