DUMP函数用于查看字段底层字节表示,基本用法为DUMP(col_name, 16)以十六进制显示;Typ=96表示CHAR、Typ=1为VARCHAR2、Typ=12为DATE;Len值反映实际字节数,可据此判断字符集(如中文Len=4说明ZHS16GBK,Len=6则可能为AL32UTF8);对NULL返回NULL,不支持CLOB全文,需配合SUBSTR截取。

怎么用 DUMP 函数查字段的底层字节表示
DUMP 不是调试工具,它直接返回字段在数据块里实际存的字节序列(含类型、长度、进制编码)。关键不是“看值”,而是确认“值怎么存的”——比如一个中文字符到底是按 ZHS16GBK 存了 2 字节,还是按 AL32UTF8 存了 3 字节。
基本用法:DUMP(col_name, 16) 表示以十六进制输出;10 是十进制(默认),8 是八进制,17 会额外显示 ASCII 可见字符(如 Typ=1 <code>Len=2: 65, 66 "AB")。
-
DUMP对NULL返回NULL,不是空字符串,别误判 - 结果里的
Typ=96表示CHAR,Typ=1是VARCHAR2,Typ=12是DATE,这些 ID 在不同 Oracle 版本中基本稳定 - 如果字段是
CHAR(10)但只插了'a',DUMP显示Len=10且后面全是32(空格 ASCII 码),这就是定长填充的铁证
DUMP 查中文乱码时最该盯住哪几项
中文显示为 ??? 或方块,不等于存储错了——可能只是客户端和服务端解码链断了。DUMP 能帮你定位断在哪一环。
执行:SELECT DUMP('中国', 16) FROM DUAL;,如果返回类似 Typ=96 Len=4: d6,d0,b9,fa,说明:
-
Len=4→ 当前会话字符集是ZHS16GBK(每个汉字占 2 字节) -
d6,d0和b9,fa是 GBK 编码值,不是 UTF-8 的e4,b8,ad或e5,9b,bd - 如果服务端字符集是
AL32UTF8,但这里看到d6,d0,基本可断定客户端NLS_LANG设错了,把 UTF-8 字节当 GBK 发过去了
为什么 DUMP 结果里有时出现 00 或高位字节异常
DUMP 显示的字节,就是 Oracle 实际写入数据文件的内容。出现 00 或非预期高位字节,通常不是函数 bug,而是数据本身有问题。
- 插入时用了错误编码的字符串(比如用 Notepad 以 ANSI 保存含中文的 SQL 文件,再用 sqlplus 执行,而
NLS_LANG却设成AMERICAN_AMERICA.AL32UTF8) -
CHAR列存了带末尾空格的字符串,DUMP会把所有填充空格(ASCII20)都列出来,容易和真正业务空格混淆 - 从其他数据库导出再导入 Oracle 时,没做字符集转换,原始字节被原样塞进字段,
DUMP就会暴露这些“非法”字节序列
查 CLOB 或长文本时 DUMP 的限制
DUMP 对 CLOB 默认只取前 32767 字节,且不支持 LENGTH 参数截断——这点和文档常写的“支持 length 参数”不符,实测 Oracle 19c/21c 均如此。
想看大文本开头几十字节:
- 先用
SUBSTR(clob_col, 1, 100)截取,再套DUMP:DUMP(SUBSTR(clob_col, 1, 100), 16) - 注意
SUBSTR按字符计数,不是字节;若字段含多字节字符(如中文),SUBSTR(..., 100)可能实际返回远超 100 字节 -
DUMP无法处理 SecureFile CLOB 的加密或压缩状态,返回的是解密/解压后的字节流
真正要验数据块级存储细节,得结合 ALTER SYSTEM DUMP DATAFILE + DBA_EXTENTS 定位块号,DUMP 函数只是第一道快速筛查工具。


















