Navicat 17导入向导不自动清洗脏数据,必须在字段映射阶段人工校验列名与类型、逐列检查对齐、手动忽略异常列;真正清洗需用SQL脚本或LOAD DATA配合REPLACE、NULLIF、CAST等函数实现。
导入向导里字段映射阶段必须手动校验列名和类型
navicat 17 的「导入向导」不会自动识别脏数据,它只做结构映射。如果你的 csv 或 excel 文件第一行是 user_name,而第二行突然出现 404 或空字符串,向导照单全收——它不报错,也不过滤,直接把 404 当作合法值塞进目标字段。所以清洗动作必须在映射环节人工干预:点击「下一步」到字段映射页后,逐列检查「源字段」是否对齐「目标字段」,尤其注意那些含空格、大小写混用、中英文标点混杂的列名(比如 order date 和 order_date 被视为不同列)。若发现某列全是 null 或 "",可临时勾选「忽略此列」跳过导入。
用 SQL 脚本导入时才能真正控制清洗逻辑
真正能做清洗的只有「运行 SQL 文件」或「LOAD DATA LOCAL INFILE」这类底层方式。Navicat 17 支持在导入脚本中嵌入转换逻辑,例如清除字符串中的不可见字符、替换占位符、强制类型转换:
- 用
REPLACE(REPLACE(@col, '\r', ''), '\n', '')去掉换行符 - 用
NULLIF(TRIM(@col), '')把空字符串转为NULL - 用
CAST(NULLIF(@amount, '') AS DECIMAL(12,2))避免空值转数字时报错 - 注意
LOAD DATA中的SET子句必须写在INTO TABLE之后、(...)字段列表之前,顺序错就语法报错
别信“自动清洗”选项——Navicat 17 根本没有这个功能
菜单里任何叫「智能清洗」「自动修正」的按钮都是幻觉。所谓「数据导入向导」里的「预览」只是展示前几行原始文本,不执行任何校验;「数据类型猜测」仅基于样本值粗略推断,遇到 "123" 和 "N/A" 混排,它大概率猜成 VARCHAR,然后让你手动改。常见错误现象包括:
- 日期字段导入后变成
0000-00-00:因为源数据含"--"或"missing",MySQL 严格模式下拒绝插入 - 数值字段存了
"$1,234.56"却没清洗:直接入库后变成0(MySQL 类型转换失败默认归零) - 文本字段超长被截断:向导猜测为
VARCHAR(255),但实际内容有 500 字符,无声丢弃后半部分
清洗必须分两步走:先试小样,再跑全量
直接对百万行文件点「开始」等于埋雷。正确做法是:
- 先导出源文件前 100 行另存为
test_sample.csv - 在 Navicat 里用该小样走一遍完整导入流程,观察日志里有没有
Warning(尤其是Data truncated或Incorrect datetime value) - 根据警告调整 SQL 脚本里的
SET表达式,或修改向导中对应字段的目标类型 - 确认小样清洗无误后,再切换回全量文件执行
最容易被忽略的是:Navicat 导入过程不记录每行清洗详情,一旦全量失败,你只能靠日志里的行号反查源文件——所以小样验证不是省时间,是省排查成本。


















