应根据字段是否允许null来决定:若字段定义为not null,则用'';若允许null且需语义区分“未填写”与“填空”,则显式写null;注意where中null必须用is null查询,且应用层需主动转换空字符串为null。

INSERT 语句里写 NULL 还是 ''?先看字段定义
能不能插 NULL,取决于字段是否允许为 NULL(即 DESCRIBE table_name 中 Null 列是否为 YES)。如果字段定义为 NOT NULL,硬插 NULL 会直接报错:ERROR 1048 (23000): Column 'xxx' cannot be null。而空字符串 '' 是合法值,只要类型是字符串(如 VARCHAR、TEXT),哪怕字段设了 NOT NULL 也能插入。
显式写 NULL 必须加关键字,不能省略或引号包裹
想插入 NULL,必须写 NULL 字面量,漏掉、加引号、写成 'NULL' 都会出错:
- ✅ 正确:
INSERT INTO users (name, email) VALUES ('Alice', NULL); - ❌ 错误:
INSERT INTO users (name, email) VALUES ('Alice', );(语法错误) - ❌ 错误:
INSERT INTO users (name, email) VALUES ('Alice', 'NULL');(存的是字符串"NULL") - ❌ 错误:
INSERT INTO users (name, email) VALUES ('Alice', '');(存的是空字符串,不是NULL)
WHERE 查询时 NULL 必须用 IS NULL,不能用 = NULL
NULL 在 SQL 中不参与常规比较运算,WHERE email = NULL 永远不成立,结果为空。要查 NULL 值,必须用:
WHERE email IS NULLWHERE email IS NOT NULL
另外,COALESCE(email, 'unknown') 或 IFNULL(email, 'unknown') 可用于转换显示,但不会改变存储值。
应用层传参时容易忽略空字符串转 NULL 的逻辑
很多 Web 表单提交空字段时,后端收到的是空字符串 '',而不是 NULL。如果不做转换就直接拼进 INSERT,会导致语义混淆:业务上“用户没填”和“用户填了空”无法区分。
- Python 示例中常需手动判断:
email if email.strip() else None,再由 ORM 或参数化查询转为NULL - PHP 中注意
empty()对'0'等假值的误判,建议用strlen($str) === 0判断是否真为空 - 前端提交前也可统一将空白字符串转为
null,避免服务端歧义
真正麻烦的不是怎么写 NULL,而是字段设计阶段没想清楚要不要允许 NULL、以及上下游系统对空值的约定是否一致。










