SQL中IS NULL查询返回非NULL值是什么原因?
问题排查与解决方法
- 空字符串与NULL的逻辑差异
SQL中NULL和空字符串''是完全不同的两种值,IS NULL仅能匹配字段值为真正NULL的条目,如果字段存储的是空字符串、空格、制表符等可见/不可见字符,都无法被IS NULL条件命中。大多数场景下出现该问题都是因为业务写入时将空值存为了空字符串而非NULL。 - 字段默认值配置问题
如果建表时nm_uf字段的默认值设置为''而非NULL,那么插入数据时未主动给该字段赋值的情况下,数据库会自动存入空字符串而非NULL,自然无法通过IS NULL检索到。 - 隐藏字符干扰
部分场景下字段可能存入了零宽空格、换行符等不可见的特殊字符,肉眼观测时和空值无差异,但实际属于有效字符串,不会被IS NULL识别。
排查方案
你可以执行以下SQL确认字段的实际存储情况:
SELECT nm_uf, (nm_uf IS NULL) AS is_real_null, LENGTH(nm_uf) AS string_length FROM 你的表名 LIMIT 20;
如果返回结果中你以为是NULL的行is_real_null值为0、string_length大于0,就说明这些行存储的不是真NULL,你可以调整查询条件为nm_uf = ''或者结合TRIM函数去除空白字符后再判断:
SELECT * FROM 你的表名 WHERE TRIM(nm_uf) = '' OR nm_uf IS NULL
内容的提问来源于stack exchange,提问作者Vinicius-Oliv
相关产品推荐
相关产品推荐

