根本原因是phpMyAdmin未识别空字段为缺失值,而是当作普通文本处理;它封装了LOAD DATA INFILE但去除了NULLIF、SET等高级控制,导致,,被存为'',NULL字面量被存为字符串'NULL',\N也不被识别。
phpmyadmin 导入 csv 时把空字段(如 ,,)存成字符串 'null' 而不是 sql 的 null,根本原因在于:它**没识别出这是缺失值,而是当成了普通文本**。这不是 bug,是默认行为——它不会主动把空字符串、null 字面量或 \n 当成 sql null,除非你明确告诉它哪些算“空”。
phpMyAdmin 不会自动把空字符串转为 SQL NULL
它底层用的是 MySQL 的 LOAD DATA INFILE 逻辑,但做了简化封装,**去掉了对 NULLIF、SET 子句等高级控制的支持**。所以:
- CSV 中的
,,(两个逗号紧挨)被解析为''(空字符串),然后原样插入——哪怕目标列是INT NULL或VARCHAR(255) NULL - CSV 中写的
NULL(不带引号)会被当成字面量字符串'NULL',不是 SQLNULL -
\N同样不会被识别,phpMyAdmin 没暴露NULL TERMINATED BY '\N'这类选项
为什么你看到的“NULL”是字符串,不是真正的 NULL
常见现象是:导入后查 SELECT ISNULL(col), col IS NULL, col = 'NULL' FROM t1,发现 col = 'NULL' 为 true,而 col IS NULL 为 false。这说明:
- 数据源里可能写了
"NULL"或NULL(无引号),但 phpMyAdmin 把它当文本读进来了 - 或者你用了 Excel 导出,它把空白单元格写成
NULL字符串(不是标准行为,但某些版本/设置下会发生) - 更隐蔽的是:字段被双引号包裹且含空格,比如
" ",它既不是空字符串也不是NULL,但人眼看起来像空
怎么让空字段真变成 SQL NULL
phpMyAdmin 界面本身没提供 NULLIF 或 SET 功能,所以必须前置处理或换方式:
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- 在 CSV 文件里,把所有想变
NULL的空字段统一替换成\N(注意是反斜杠加大写 N),然后勾选 phpMyAdmin 导入页的「使用 NULL 值」选项(部分版本支持,但不保证生效;若无效,说明该版本忽略此设置) - 更可靠的做法:用文本编辑器把所有
,,替换为,\N,,再把行首的,\N和行尾的\N,单独处理(避免错位) - 终极方案:别走 phpMyAdmin 页面上传,改用命令行执行
LOAD DATA INFILE,显式写SET col = NULLIF(@col, '')—— 这才是可控的方式 - 如果只能用 phpMyAdmin,导入后立刻执行
UPDATE t1 SET col = NULL WHERE col = '' OR col = 'NULL';(注意先备份)
容易被忽略的细节:引号和空格也在捣乱
你以为是空,其实不是:
立即学习“PHP免费学习笔记(深入)”;
-
"",是空字符串,但" ",(带空格)是长度为 1 的字符串,NULLIF(@col, '')对它无效 - Excel 导出常把空单元格写成
""(双引号内为空),phpMyAdmin 能正确解析为'';但如果导出时勾了「保留格式」,可能变成" " - 字段定义为
NOT NULL时,哪怕你写了\N或设了NULLIF,MySQL 也会报错,此时必须先ALTER TABLE ... MODIFY col TYPE NULL
真正麻烦的从来不是“怎么标 NULL”,而是“怎么确认它真的是空”——多看几行原始 CSV 的十六进制视图,比猜强得多。


















