“空字符串转为NULL”仅对允许NULL的字段生效,需配合正确字段映射、编码及分隔符设置;NOT NULL字段遇空字符串必报错,应改用\N显式标识NULL或设置DEFAULT值。
navicat 导入 txt 时,“空字符串转为 null”不是万能开关,它只对允许为 null 的字段生效,且必须配合正确的字段映射和编码设置,否则会报错或静默失败。
为什么勾选了“空字符串转为NULL”还是报错?
常见错误如 Incorrect integer value: '' for column 'age',说明该字段是 INT NOT NULL,而 TXT 中对应列为空(比如 name,,city 中的第二个逗号)。Navicat 不会把空字符串塞进 NOT NULL 字段——它直接拒绝插入。
- 该选项仅在目标字段定义为
NULL时起作用;若字段有DEFAULT值,也建议关闭此选项,否则默认值不会被触发 - 空字符串(
"")和真正缺失字段(比如列数不足导致某列没值)是两回事:前者可能触发该选项,后者由 Navicat 按“字段数不足→填 NULL”逻辑处理,仍受限于 NOT NULL 约束 - 如果 TXT 是用空格或制表符分隔,且某列纯由空格组成(如
张三 ,25,上海),Navicat 默认不 trim,空格会被当有效字符,不触发“空字符串”判定
怎样让空字符串走默认值而不是报错?
关键不是依赖导入向导里的勾选项,而是靠数据库层行为:取消勾选 空字符串转为NULL,并确保目标字段本身定义了 DEFAULT。
- 例如字段定义为
status TINYINT DEFAULT 0,TXT 中写成张三,,上海(第二列为“空”),导入时该列就会被设为0 - 但注意:如果字段是
NOT NULL且无DEFAULT,哪怕取消勾选,Navicat 仍会因值缺失而中断整个批次 - MySQL 5.7+ 默认 SQL mode 含
STRICT_TRANS_TABLES,会让空字符串插入失败;临时绕过可在导入前执行SET sql_mode = '',但不推荐长期关闭严格模式
真正表示 SQL NULL 应该用 \N,不是留空
Navicat 支持显式 NULL 标记,比依赖空字符串更可靠。
- TXT 中写
张三,\N,上海,并在「高级设置」中勾选NULL值表示为并填入\N,才能确保第二列被识别为 SQLNULL - 这个机制不受字段是否允许 NULL 影响——它只是告诉 Navicat “遇到 \N 就发一个 NULL 字面量过去”,后续是否被接受,取决于表结构
- 别混淆
\N和NULL文本:写成NULL(纯字母)不会被识别,只会当作字符串插入
容易被忽略的编码与分隔符干扰
空字符串判定的前提是 Navicat 正确解析了列边界。一旦分隔符识别失败,所谓“空字符串”可能根本不在预期列上。
- 如果 TXT 实际用两个连续制表符
\t\t分隔,而你只设了单个\t,中间会被识别为一个含空格的字段,而非空字符串 - 文件带 BOM 头(尤其 UTF-8 with BOM)可能导致首列读出不可见字符,表面看是空,实际是
,Navicat 不认为它是空字符串 - 用记事本另存为 UTF-8(无 BOM)+ 明确选
UTF-8编码 + 手动指定分隔符(不要依赖自动检测),才能让“空字符串”逻辑稳定生效


















