Navicat导出Excel行数被截断主因是默认使用.xls格式(限65536行)及字段长度仅按前8行推断;应改选.xlsx格式、显式CAST转宽类型、先导CSV验证数据完整性。
导出行数被Excel旧格式硬性截断
navicat 默认导出为 .xls(excel 97–2003)时,单张工作表最多只支持 65536 行(含表头),超出部分静默丢弃,不报错也不提示。你查 select count(*) 是 7 万行,打开 excel 却只有 65536 行——这不是 navicat 漏读,是 excel 格式本身拒绝写入。
- 立刻改用
.xlsx格式:导出向导中选择 “Excel 2007+ (.xlsx)” - 别信“自动识别格式”:即使文件名写了
.xlsx,若导出时没在格式下拉菜单里手动选中它,Navicat 仍可能 fallback 到.xls - 批量导出脚本更要小心:
navicat.exe /export命令必须显式带-format=xlsx参数,否则默认走.xls
字段长度推断错误导致内容被砍断
Navicat 导出前会扫描查询结果的前 8 行,按最长内容长度推断字段类型。如果这 8 行里 content 最长才 200 字符,它就认定该列为 VARCHAR(255),后续超长值(比如 2000 字中文)在写入 Excel 前就被内部缓冲截掉——你看到的不是“显示不全”,是根本没写进去。
- 先验证真实长度:
SELECT LENGTH(content) FROM your_table ORDER BY LENGTH(content) DESC LIMIT 1; - 导出 SQL 中强制转宽类型:
SELECT CAST(content AS CHAR(4000)) AS content FROM ... - 避免无长度声明的函数:
TRIM(content)不改变推断逻辑,SUBSTR(content, 1, 3000)可控但会丢数据,慎用
WHERE 条件或 Limit 设置静默生效
导出向导里的过滤条件和行数限制,是独立于当前查询窗口的。你在 SQL 窗口写了完整语句,但导出时勾了“导出前 1000 行”,或高级选项里填了 status = 'active'(而实际字段叫 is_active),Navicat 就真按这个跑,且不校验语法、不提示空结果。
- 导出前点「高级」→ 复制 WHERE 内容 → 粘到新查询窗口执行
SELECT COUNT(*) FROM table WHERE ...看是否真有数据 - 检查「选项」页里的
Limit rows:设成0才表示不限制;设成1就只导 1 行 - 确认没勾选
Export only structure(仅导出结构),这个选项一开,数据全消失
字符编码与 Excel 解析错位造成“假丢失”
导出 CSV 后用 Excel 直接双击打开,常因编码/分隔符不匹配导致字段错列、换行符误判为新行、中文变乱码——你以为某字段后半段“丢了”,其实是 Excel 把逗号当分隔符、把换行当行结束,整行数据挤进第一列里了。
- 导出 CSV 时务必设置:编码选
UTF-8 with BOM,文本限定符选"(双引号),分隔符选, - 含换行符的字段,导出前用
REPLACE(content, '\n', '|')临时替换,比硬扛 Excel 解析更稳 - 打开 CSV 别双击:用 Excel 的「数据 → 从文本/CSV」导入,并手动指定 UTF-8 编码和分隔符











