第一部分:NCHAR / NVARCHAR 数据类型
核心定义
N 前缀表示使用数据库的 国家字符集(National Character Set),该字符集在 Oracle 和 MySQL 中均基于 Unicode 编码(如 AL16UTF16 或 utf8mb4),用于支持多语言数据。
数据类型对照
| 类型 | Oracle 19c | MySQL 8.0 |
|---|---|---|
| 固定长度 | NCHAR | NCHAR / NATIONAL CHAR |
| 可变长度 | NVARCHAR2 | NVARCHAR / NATIONAL VARCHAR |
说明:Oracle 23c 与 19c 此部分无核心差异;MySQL 8.4 仍兼容 8.0 语法,但官方推荐直接使用
CHAR/VARCHAR + utf8mb4替代 NCHAR/NVARCHAR 以避免弃用警告。
每字符字节数
Oracle 19c
| 类型 | 字符类型 | 每字符字节数 | 字符集 | 补充说明 |
|---|---|---|---|---|
| NCHAR/NVARCHAR2 | ASCII/CJK(中日韩) | 2 字节 | AL16UTF16 | BMP平面字符固定2字节 |
| NCHAR/NVARCHAR2 | 补充字符(如emoji) | 4 字节 | AL16UTF16 | 补充平面字符占2个字符位 |
| NCHAR/NVARCHAR2 | ASCII/CJK(中日韩) | 1/3 字节 | Oracle UTF8 (AL32UTF8 前身,又称 UTF8MB3) | 需手动配置字符集 |
| NCHAR/NVARCHAR2 | 补充字符(如emoji) | 不支持 | Oracle UTF8 (AL32UTF8 前身,又称 UTF8MB3) | 无补充平面支持 |
说明:Oracle 的 NCHAR 和 NVARCHAR2 类型使用独立的国家字符集(由 NLS_NCHAR_CHARACTERSET 参数控制)。在 19c 中,该参数仅允许设为 AL16UTF16(默认)或 UTF8(Oracle 自研的 3 字节 UTF-8 变体)。当设为 UTF8 时,无法存储 Unicode 补充平面字符(如 emoji),因为该编码最大仅支持 3 字节(即 BMP 平面)。Oracle UTF8 已过时,官方自 11g 起推荐使用 AL32UTF8(但 NCHAR 不支持 AL32UTF8)。
MySQL 8.0
| 类型 | 字符类型 | 每字符字节数 | 字符集 | 补充说明 |
|---|---|---|---|---|
| NCHAR/NVARCHAR | ASCII | 1 字节 | utf8mb4 | 8.0.28+ 隐含字符集从utf8mb3改为utf8mb4,utf8mb3不建议使用 |
| NCHAR/NVARCHAR | CJK(中日韩) | 3 字节 | utf8mb4 | |
| NCHAR/NVARCHAR | 补充字符 | 4 字节 | utf8mb4 | 完整支持Unicode补充平面 |
说明:Oracle 23c 字节数规则与19c一致;MySQL 8.4 完全沿用8.0的字节数规则,仅强化了utf8mb4的推荐性。
最大存储长度
| 数据库 | 类型 | 最大存储(Oracle 19c / MySQL 8.0) | 其他版本差异说明 |
|---|---|---|---|
| Oracle | NCHAR | 2000 字符(固定上限,不受 MAX_STRING_SIZE 影响) | 23c 配置规则与19c一致 |
| Oracle | NVARCHAR2 | 4000 字符(默认)/ 32767字符(EXTENDED配置) | 23c 扩展后与PL/SQL长度一致,19c同理 |
| MySQL | NCHAR | 最多255 字符 | 受行总字节 ≤ 65,535 限制;限制在 255 个字符以内,主要是为了确保索引效率和行大小限制。 |
| MySQL | NVARCHAR | 受行总字节限制 | 8.4 无扩展,行总字节上限仍为65535。由于行格式、NULL标志位、长度标识符等开销,实际可用的字符数会略少。 |
存储示例
| 数据 | 字符数 | Oracle 19c NVARCHAR2(10)(AL16UTF16) | Oracle 19c NVARCHAR2(10)(Oracle UTF8) | MySQL 8.0 NVARCHAR(10) utf8mb4 |
|---|---|---|---|---|
| "Hello" | 5 | 10 字节(5×2) | 5 字节(1×5) | 5 字节(1×5) |
| "你好" | 2 | 4 字节(2×2) | 6 字节(3×2) | 6 字节(3×2) |
| "😀" | 1 | 4 字节(补充字符占2个字符位) | 存储失败(不支持) | 4 字节(4×1) |
说明:Oracle 23c / MySQL 8.4 存储计算规则与上述版本完全一致。
语法等价
Oracle 19c
sql
-- 默认字符集(AL16UTF16)
NCHAR(10)
NVARCHAR2(50)
-- 切换为Oracle UTF8字符集(需先配置参数)
ALTER SYSTEM SET NLS_NCHAR_CHARACTERSET = 'UTF8' SCOPE=SPFILE;
-- 重启数据库后生效,仅19c+支持此配置
MySQL 8.0
sql
-- 固定长度(8.0.28+ 隐含utf8mb4)
NCHAR(10)
NATIONAL CHAR(10)
-- 可变长度
NVARCHAR(10)
NATIONAL VARCHAR(10)
-- 官方推荐(避免弃用警告)
CHAR(10) CHARACTER SET utf8mb4
VARCHAR(10) CHARACTER SET utf8mb4
说明:MySQL 8.4 完全兼容8.0语法,仅进一步强调推荐使用
CHAR/VARCHAR + utf8mb4;Oracle 23c 语法与19c无差异。
第二部分:字符集与编码
Oracle AL16UTF16 与 Oracle 专属 UTF8 核心区别
| 特性 | AL16UTF16(Oracle 19c 默认) | Oracle UTF8(19c+ 可选) |
|---|---|---|
| 编码格式 | 大端序 UTF-16 | 兼容 UTF-8(等价 MySQL utf8mb3) |
| 单字符字节数 | BMP字符2字节,补充字符4字节 | ASCII 1字节、CJK 3字节,无补充字符支持 |
| emoji/补充平面字符 | 支持 | 不支持 |
| 存储空间(英文) | 比 Oracle UTF8 多1倍 | 更节省 |
| 存储空间(中日韩) | 比 Oracle UTF8 少1字节/字符 | 比AL16UTF16多1字节/字符 |
| 配置方式 | 默认无需配置 | 需修改 NLS_NCHAR_CHARACTERSET 参数并重启 |
| 适用场景 | 多语言(含emoji)、中日韩为主的场景 | 适合纯英文业务、传统企业内部系统,无国际化和 emoji 需求 |
核心字符集字节数(Oracle 19c / MySQL 8.0)
| 字符类型 | ASCII | MySQL utf8mb4(标准 UTF-8) | Oracle AL16UTF16(UTF-16 大端序) | Oracle UTF8(AL32UTF8 前身,utf8mb3 等价) |
|---|---|---|---|---|
| 英文字符(A) | 1 | 1 | 2 | 1 |
| 中日韩字符(好/あ/한) | --- | 3 | 2 | 3 |
| 补充字符(😀) | --- | 4 | 4 | 不支持 |
| 特殊符号(如 ©、®) | 1 | 1 | 2 | 1 |
关键说明
- Oracle 19c:
- NCHAR/NVARCHAR2 默认使用 AL16UTF16,兼顾多语言和emoji支持,中日韩字符存储更节省空间;
- 可选 Oracle UTF8 字符集,仅适合无emoji需求的场景,需手动配置且重启生效;
- NVARCHAR2 比 VARCHAR2 略耗性能(Unicode转换),仅多语言场景使用;
- 扩展最大长度需修改
MAX_STRING_SIZE=EXTENDED参数。
- MySQL 8.0:
- nnoDB 引擎下,utf8mb4 比 utf8mb3 性能略低,但兼容性全覆盖,8.0.28+ 无需纠结直接使用;
- InnoDB 引擎下,CHAR/NCHAR 最长是 255 字符,超出需改用VARCHAR;
- 行总字节上限65535,NVARCHAR 最大字符数受此限制。
性能与配置(核心版本)
Oracle 19c 字符集配置建议
sql
-- 查看当前NCHAR字符集
SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_NCHAR_CHARACTERSET';
-- 1. 保留默认AL16UTF16(推荐,支持全字符)
-- 无需修改,适合多语言+emoji场景
-- 2. 切换为Oracle UTF8(仅无emoji需求时)
ALTER SYSTEM SET NLS_NCHAR_CHARACTERSET = 'UTF8' SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
MySQL 8.0 字符集配置建议
ini
# my.cnf 配置(推荐)
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
utf8mb4_unicode_ci 为通用排序规则,支持多语言排序;若仅需英文 / 数字排序,可使用 utf8mb4_ascii_ci,性能更高;utf8mb4_general_ci 为旧版排序规则,官方不推荐
总结
- Oracle 19c:优先使用默认的 AL16UTF16 字符集(支持emoji、中日韩字符存储更省空间),仅无emoji需求且以英文为主时考虑切换为 Oracle UTF8;
- MySQL 8.0 :直接使用
VARCHAR + utf8mb4替代 NCHAR/NVARCHAR,兼顾兼容性和全字符支持; - 跨库同步时,Oracle AL16UTF16 与 MySQL utf8mb4 均支持全 Unicode 字符(含emoji),通过编码转换工具可实现无损失跨库同步,Oracle UTF8 需过滤emoji后再同步至MySQL。