Oracle 19c 与 MySQL 8.0 字符串数据类型对比

第一部分: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

关键说明

  1. Oracle 19c:
  • NCHAR/NVARCHAR2 默认使用 AL16UTF16,兼顾多语言和emoji支持,中日韩字符存储更节省空间;
  • 可选 Oracle UTF8 字符集,仅适合无emoji需求的场景,需手动配置且重启生效;
  • NVARCHAR2 比 VARCHAR2 略耗性能(Unicode转换),仅多语言场景使用;
  • 扩展最大长度需修改 MAX_STRING_SIZE=EXTENDED 参数。
  1. 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 为旧版排序规则,官方不推荐

总结

  1. Oracle 19c:优先使用默认的 AL16UTF16 字符集(支持emoji、中日韩字符存储更省空间),仅无emoji需求且以英文为主时考虑切换为 Oracle UTF8;
  2. MySQL 8.0 :直接使用 VARCHAR + utf8mb4 替代 NCHAR/NVARCHAR,兼顾兼容性和全字符支持;
  3. 跨库同步时,Oracle AL16UTF16 与 MySQL utf8mb4 均支持全 Unicode 字符(含emoji),通过编码转换工具可实现无损失跨库同步,Oracle UTF8 需过滤emoji后再同步至MySQL。
相关推荐
六月雨滴6 小时前
存储性能监控与优化及最佳实践总结
数据库·oracle·dba
学习论之费曼学习法6 小时前
Agent记忆系统:让AI拥有长期记忆能力
数据库·人工智能·oracle
arronKler8 小时前
数据库设计三大范式
数据库·oracle
jran-8 小时前
MySQL多表操作 查询&子查询&外键约束
数据库·mysql
看到代码头都是大的9 小时前
CentoOS7安装mysql 8.0.46
mysql
oradh9 小时前
Oracle物理存储结构概述
数据库·oracle·物理结构·oracle基础·oracle入门·oracle物理存储结构概述
数据最前线10 小时前
亡羊补牢?Oracle 计划推出月度安全补丁
数据库·oracle
这个DBA有点耶11 小时前
某银行核心系统从Oracle迁移到国产数据库全程复盘(DBA视角)
数据库·经验分享·sql·oracle·dba·智能硬件
阿坤带你走近大数据12 小时前
DM达梦数据库的介绍
数据库·mysql·oracle·国产信创
我科绝伦(Huanhuan Zhou)12 小时前
oracle linux8.8一键部署oracle 11g
数据库·oracle