navicat for oracle导出含clob表时数据截断或失败,根本原因是默认“文本模式”导致clob被字符集转换和长度限制(如仅取前4000字符),须改用data pump并勾选include lob columns、指定服务端目录、确保字符集一致及添加transform参数。

Navicat for Oracle导出含CLOB表时数据截断或失败
Navicat for Oracle 默认使用 SQL 导出方式(SELECT ... INTO OUTFILE 类逻辑)处理 CLOB 字段,但实际底层调用的是 OCI 接口 + PL/SQL 批量提取,对大对象支持不透明。常见现象是:导出的 SQL 文件里 CLOB 值被截成 '...' 或直接为空,或者导出过程卡在 99% 后静默失败。
根本原因不是 Navicat 界面按钮没点对,而是导出引擎默认启用“文本模式”而非“二进制安全模式”,导致 CLOB 内容被当作普通字符串做字符集转换和长度限制(如只取前 4000 字符)。
- 右键表 →
转储SQL文件→ 即使勾选了“结构和数据”,CLOB 仍大概率丢失 -
数据传输功能对 CLOB 支持更不稳定,尤其当目标库字符集与源库不一致时(如 AL32UTF8 → ZHS16GBK),会触发隐式转换错误 - 若表中 CLOB 字段值超过 32KB,OCI 驱动可能直接抛出
ORA-01403: no data found或ORA-06502: PL/SQL: numeric or value error
必须改用 Data Pump(expdp)而非 SQL 导出
Oracle 原生 Data Pump 是唯一能完整保全 CLOB/BLOB 的机制,Navicat for Oracle 提供了封装入口,但需手动激活——它不会在右键菜单默认显示,必须从顶部菜单栏进入。
- 点击顶部菜单
其他→数据泵→数据泵导出 - 模式选择
TABLE(不要选 SCHEMA,避免导出整个用户下所有对象) - 在“表名”输入框中填入目标表名,例如
MY_TABLE;支持逗号分隔多个表,如MY_TABLE,ANOTHER_TABLE - 务必在“高级选项”中勾选
Include LOB columns(该选项默认关闭) - 转储文件目录必须是 Oracle 数据库服务端已注册的目录对象(如
DATA_PUMP_DIR),不能填本地路径;可在其他 → 目录中确认是否存在可写目录
还原时 CLOB 乱码或报 ORA-31693 的真实原因
即使导出成功,用 Navicat 的 数据泵导入 功能还原时仍可能失败,典型错误是 ORA-31693: Table data object "xxx" failed to load/unload and is being skipped,或 CLOB 内容变成问号、方块。
- 检查数据库字符集:执行
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';,确保导出/导入两端一致;若不一致,必须在导入时显式指定REMAP_CHARSET - 导入前未创建对应表空间或用户配额不足,会导致 LOB 段分配失败;错误日志里常伴随
ORA-01653或ORA-01654 - Navicat 调用 impdp 时默认不加
TRANSFORM=SEGMENT_ATTRIBUTES:n,导致原表的 LOB 存储参数(如CHUNK,PCTVERSION)被强制继承,而目标库表空间不支持;建议手动在“高级选项”中添加该参数 - 若原表 CLOB 含非 ASCII 控制字符(如 \x00、\x0B),需额外勾选
Convert binary data选项
绕过 Navicat 图形界面,用命令行验证 Data Pump 可靠性
当图形界面反复失败,最有效的排查方式是直接在数据库服务器上跑 expdp/impdp 命令,对照 Navicat 底层调用是否缺失关键参数。
例如导出单表 CLOB:
expdp system/password@orcl \ DIRECTORY=DATA_PUMP_DIR \ DUMPFILE=mytable_clob.dmp \ TABLES=SCOTT.MY_TABLE \ INCLUDE=TABLE_DATA \ TRANSFORM=SEGMENT_ATTRIBUTES:n \ LOGFILE=expdp_mytable.log
再对比 Navicat 生成的日志(通常位于 %APPDATA%\PremiumSoft\Navicat\Logs\ 或 ~/Library/Logs/Navicat/),看是否漏掉了 INCLUDE=TABLE_DATA 或 TRANSFORM 参数——这类细节差异正是 CLOB 备份不可靠的根源。
真正麻烦的从来不是“能不能点出来”,而是 Oracle 对 LOB 的存储、传输、字符集绑定三者耦合极深,Navicat 的图形封装掩盖了这些依赖,等出问题时已经跨过了可调试窗口。











