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。
相关推荐
草莓熊Lotso2 小时前
MySQL 数据库基础入门:从概念到实战
linux·运维·服务器·数据库·c++·人工智能·mysql
mingdong06082 小时前
MySQL 的mysql_secure_installation安全脚本执行过程介绍
数据库·mysql·安全
远方16092 小时前
116-Oracle 26ai 断言(assertion)新特性
大数据·数据库·sql·oracle·database·ai编程
白云偷星子2 小时前
云原生笔记6
linux·运维·笔记·mysql·云原生
jason_renyu2 小时前
Windows 系统安装配置 MySQL 服务(含多端口/多实例管理)
windows·mysql·windows安装mysql·windows配置mysql·mysql多端口配置
艾莉丝努力练剑2 小时前
【QT】常用控件(一):初识控件,熟悉QWidget
android·linux·数据库·qt·学习·mysql·qt5
艾莉丝努力练剑2 小时前
MySQL查看命令速查表
linux·运维·服务器·网络·数据库·人工智能·mysql
码luffyliu3 小时前
踩坑记:Go + MySQL 时区处理导致时间显示差 8 小时
mysql·go
拾贰_C3 小时前
【CentOS | MySQL | uninstall】关于安装的MySQL与系统版本不匹配问题,MySQL卸载与重装
mysql·adb·centos