DUMP函数返回字段真实字节存储结构而非类型名,如“袁”在AL32UTF8下占3字节、UTF16下占2字节;参数缺省时返回TYP=1 LEN=2: 195,177等十进制格式,加1016得十六进制C3,B1,便于排查乱码;CHAR与NCHAR同属TYP=96但LEN体现字节差异,且空格填充为真实写入字节;结合NLS_CHARACTERSET用DUMP可确认数据是否因字符集错配而损坏。

用 DUMP 查看字段底层字节表示,不是“类型名”,而是真实存储结构
DUMP 不返回 VARCHAR2 或 CHAR 这类类型声明,它返回的是该值在数据库中实际以什么字节序列、什么字符集编码存下来的。比如中文“袁”在 AL32UTF8 下占 3 字节,在 UTF16(NCHAR)下占 2 字节——DUMP 能直接告诉你这个差异,而不是靠猜或查文档。
DUMP 的参数顺序和默认行为容易出错
函数签名是 DUMP(expr [, return_format [, start_position [, length ]]])。最常踩的坑是漏掉第二个参数,导致返回格式不可读:
- 不传参数:返回类似
TYP=1 LEN=2: 195,177的字符串,TYP=1表示VARCHAR2,但没显示进制,数字是十进制还是十六进制?得靠经验判断 - 加
1016:返回十六进制字节,如TYP=1 LEN=2: C3,B1,适合排查乱码、校验编码 - 加
1010:返回十进制字节,如TYP=1 LEN=2: 195,177,方便对照 ASCII 表或 Unicode 码点 -
start_position和length可用于截取查看某几个字符的字节,避免整字段太长干扰判断
对比 CHAR 和 NCHAR 字段时,DUMP 暴露填充逻辑差异
建表时定义 col_char CHAR(10) 插入 'a',DUMP(col_char) 返回 TYP=96 LEN=10: 97,32,32,32,32,32,32,32,32,32;而 col_nchar NCHAR(10) 插入同样内容,返回 TYP=96 LEN=20: 0,97,0,32,0,32,...。关键点:
-
TYP=96对两者都成立,说明 Oracle 内部把它们归为同一类“固定长度字符类型” -
LEN=10vsLEN=20直接体现字节长度差异:CHAR按字节算,NCHAR按双字节(UCS-2/UTF16)算 - 所有空格填充都是真实写入的字节,不是逻辑忽略——这直接影响
LENGTH、索引大小、网络传输量
排查乱码或隐式转换问题时,必须配合 NLS_CHARACTERSET 看 DUMP
同一个字符串在不同字符集下 DUMP 结果完全不同。比如插入 '测试':
- 库字符集为
AL32UTF8:DUMP显示 6 字节(每个汉字 3 字节) - 库字符集为
ZHS16GBK:DUMP显示 4 字节(每个汉字 2 字节) - 如果客户端 NLS 设置错误(比如客户端设成 UTF8,但服务端是 GBK),
DUMP会暴露“错位字节”,例如出现0x81 0x40这类非法组合
这时候单看字段值显示是“?”或方块,但 DUMP 是唯一能确认数据是否已损坏的手段——字节一旦写错,就不可逆。











