Navicat 不支持直接导出 DBF 格式,因其未原生实现该老旧 xBase 格式;可行方案为先导出 CSV/Excel 再用兼容工具转换,或直连数据库脚本生成 DBF。
Navicat 不支持直接导出 DBF 格式
navicat 本身没有 dbf 导出功能,无论哪个版本(windows/macos)、哪个数据库类型(mysql、postgresql、sql server 等),导出向导里都找不到 dbf 选项。这不是你漏选了,是它压根没实现——dbf 是老旧的 xbase 格式,现代数据库工具普遍不原生支持。
常见错误现象:导出为 CSV → 用 Excel 另存为 DBF,结果字段名被截断、中文乱码、日期变数字、逻辑型(.T./.F.)丢失;或者用第三方转换工具批量处理时,NULL 值变成空字符串,导致 FoxPro 或 Clipper 读取失败。
真正可行的路径只有两条:
- 通过 Navicat 导出为中间格式(推荐
CSV或Excel),再用兼容性更强的工具转 DBF - 绕过 Navicat,用命令行或脚本直连数据库 + 生成 DBF(适合批量、自动化)
导出 CSV 后用 DBF Converter 转换的实操要点
这是最常用也最容易上手的方式,但细节决定成败。关键不是“能不能转”,而是“转出来能不能被 Visual FoxPro 或 Harbour 正确识别”。
使用场景:单表导出、字段数不多(
操作前必须检查并调整:
-
Navicat 导出 CSV时勾选导出列名,编码选GBK(不是 UTF-8,否则 FoxPro 会乱码) - 字段名只能用字母/数字/下划线,且首字符必须是字母;长度 ≤ 10 字符(
DBF 文件头限制) - 日期字段确保是
YYYY-MM-DD格式(不能带时间,也不能是 timestamp 数值) - 逻辑字段(布尔)需转成
.T./.F.字符串,不能是1/0或true/false
推荐转换工具:dbf2csv(命令行)或 DBF Viewer Plus(GUI)。后者更直观,导入 CSV 后可手动指定每列类型(C 字符、D 日期、L 逻辑、N 数值),比自动识别靠谱得多。
用 Python + dbfread + simpledbf 批量生成 DBF(无 GUI 场景)
如果你要导出多张表、每天定时跑、或字段结构复杂(比如有 memo 字段),硬靠 Navicat + 手动点根本不可持续。这时候 Python 是更稳的选择。
注意:dbfread 只能读,不能写;真正能写的轻量库是 simpledbf(基于 dbf 包),但它默认只支持 Python 3.6–3.9,新版本需降级或改用 dbf 库本身。
关键参数和陷阱:
-
dbf.Table(filename, codepage='GBK')—— 必须显式指定codepage,否则中文字段名/内容全乱 - 字段定义必须提前声明,例如
fields=[('NAME','C',20), ('BIRTH','D'), ('ACTIVE','L')];'L'类型对应逻辑型,值必须是True/False(不是字符串) -
dbf库对 NULL 处理严格:数值/日期字段遇到 None 会报错,得先用if x is None: x = 0或datetime.date.today()填充
简短示例(从 MySQL 查询结果生成 DBF):
import dbf
table = dbf.Table('output.dbf', fields=[('ID','N',6,0), ('NAME','C',30)], codepage='GBK')
table.open(mode=dbf.READ_WRITE)
for row in mysql_cursor.fetchall():
table.append((row[0], row[1] or ''))
table.close()
FoxPro 兼容性最容易被忽略的三个点
导出来的文件后缀是 .dbf 不等于就能在 FoxPro 里打开。很多“成功生成”其实只是文件头没报错,一查数据就崩。
务必验证这三项:
- 文件头版本号必须是
0x03(dBASE III+)或0x83(dBASE III+ with memo);0x30(dBASE IV)或更高会被老 FoxPro 拒绝 - memo 字段(
M类型)必须配套生成同名的.fpt文件,且两个文件时间戳要一致,否则提示Not a table file - 字段名全大写、无空格、不以下划线开头(
_id在某些 FoxPro 版本中会被忽略)
用 hexdump -C output.dbf | head -n 1 看第一个字节,确认是不是 03。不是的话,说明生成工具用了新版格式,得换库或加参数强制降级。










