navicat 默认导出不满足 rfc 4180 标准,需手动选“文本文件”格式、设双引号为文本限定符、显式指定换行符、utf-8 with bom 编码,并在 sql 层用 replace 和 coalesce 预处理特殊字符、换行及空值。

Navicat 默认导出不是 RFC 4180 标准 CSV
Navicat GUI 导出的 CSV 文件默认不满足 RFC 4180 标准:它不强制用双引号包裹所有字符串字段,对含换行、逗号、引号的字段不做转义处理,且不保证每行字段数严格一致。Excel 能打开不代表它是标准 CSV——Python 的 pandas.read_csv() 或 Go 的 encoding/csv 包在严格模式下会报错或截断。
手动配置「文本文件」类型并启用双引号包裹
必须跳过「CSV 文件(*.csv)」这个快捷选项,改用底层更可控的「文本文件」格式:
- 右键结果集 →「导出向导」→ 类型选「文本文件」(不是 CSV 文件)
- 「输出格式设置」中:
Field separator设为,,Text qualifier必须设为",勾选Enclose fields in double quotes - 取消勾选「使用系统默认换行符」,显式设为
Windows (CRLF)或Unix (LF)(推荐LF,RFC 更宽松兼容) - 「高级」里编码选
UTF-8 with BOM(仅为了 Excel 兼容;RFC 本身不限定编码,但 UTF-8 是事实标准)
含特殊字符字段必须靠 SQL 层预处理
Navicat 不会在导出时自动转义字段内的 " 或换行符——它只按你给的原始值加一层外层引号。若字段值本身含 ",RFC 要求内部 " 变成 ""(两个双引号),而 Navicat 不做这步。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
解决办法是导出前在 SQL 中用函数清洗:
- MySQL:用
REPLACE(REPLACE(col, '"', '""'), '\n', '\r\n')(注意:MySQL 的\n在导出时可能被转成\r\n,所以统一用\r\n更稳) - PostgreSQL:用
REPLACE(REPLACE(col, '"', '""'), E'\n', E'\r\n') - 字段含换行时,
DATE_FORMAT()等时间函数也要套一层REPLACE(),否则外层引号包不住内部换行
列标题与空值处理需显式声明
RFC 4180 要求首行为字段名,且空值应导出为空字符串(而非 NULL 字面量或空白)。Navicat 默认行为不可靠:
- 务必勾选「导出列标题」,否则第一行是数据,破坏结构
- 空值默认导出为
NULL(字符串),这不是 RFC 行为;应在 SQL 中用COALESCE(col, '')显式转为空字符串 - 避免用 Navicat 的「NULL 值显示为」设置——它只影响 GUI 显示,不影响导出值
- 字段名本身含逗号或引号?Navicat 不转义列标题,需提前在 SQL 中用别名重命名,例如
col AS "user_name"
真正符合 RFC 的 CSV 很难靠 Navicat 单点配置达成,关键在 SQL 层兜底:字段清洗、空值归一、换行标准化。GUI 只负责“按你给的字符串原样加引号+逗号”,别指望它替你做语义解析。










