-- 创建转换函数CREATE OR REPLACE FUNCTION convert_empty_string_to_null()RETURNS TRIGGER AS $BEGINIF NEW.create_time = '' THENNEW.create_time := NULL;END IF;RETURN NEW;END;$ LANGUAGE plpgsql;-- 绑定触发器CREATE TRIGGER trigger_convert_empty_create_timeBEFORE INSERT OR UPDATE ON your_tableFOR EACH ROW EXECUTE FUNCTION convert_empty_string_to_null();
---
四、常见误区澄清
1. 误区:"我想插入一个空的日期,不是 NULL"
SQL 中没有 "空日期" 这个概念,所有类型的空值都统一用 NULL 表示。
NULL
表示 "未知、不存在、未赋值"
空字符串 '' 表示 "存在一个长度为 0 的字符串"
两者语义完全不同,不能混用
2. 误区:"MySQL 可以插入 '',为什么 PG 不行?"
MySQL 在 sql_mode 不包含 STRICT_TRANS_TABLES 的宽松模式下,会将空字符串自动转换为 0000-00-00 00:00:00,这是非标准的错误行为,会导致严重的数据一致性问题。
PostgreSQL 严格遵循 SQL 标准,从根源上避免了这种错误。
3. 误区:"我可以用 '0001-01-01' 代替 NULL"
绝对不推荐!这会导致:
日期计算错误(比如 AGE('0001-01-01') 会得到 2000 多年的结果)
业务逻辑混乱(无法区分 "真的没有时间" 和 "1 年 1 月 1 日")
索引和查询性能下降
---
五、最佳实践总结
1、永远使用 NULL 表示空值,不要用空字符串 '' 或特殊日期 0000-01-01
2、表结构设计时:明确哪些字段允许 NULL,哪些需要 NOT NULL 约束
3、应用程序层面:统一将空值转换为 NULL 再传入数据库
4、数据导入时:使用 NULLIF('', '') 函数自动转换空字符串
5、查询时:使用 IS NULL/IS NOT NULL 判断空值,不要用 = ''
-- 正确的空值查询SELECT * FROM your_table WHERE create_time IS NULL;-- 错误的空值查询(永远返回空结果)SELECT * FROM your_table WHERE create_time = '';
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!