项目场景:
使用golang数据库操作第三方包sqlx的时候,执行一个SELECT查询时,发现查不到数据,各个软件版本如下:
innodb:8.0.16
sqlx:v1.3.4
go-sql-driver/mysql:v1.6.0
golang:1.16.3
问题描述
下面三条语句直接在MySQL终端可以查询到数据,db.Select查询不到数据:
SELECT * FROM xxx WHERE start_time IS NULL AND ip = ?; # sqlx db.Select查不到数据,MYSQL直接查询可以查到3条
SELECT * FROM xxx WHERE ip = ? AND start_time IS NULL; # sqlx db.Select查不到数据,MYSQL直接查询可以查到3条
SELECT * FROM xxx WHERE ip = ? AND (start_time IS NULL); # sqlx db.Select查不到数据,MYSQL直接查询可以查到3条
其中,start_time为datetime类型,默认值为NULL。
原因分析:
sqlx db.Select在查询的时候,如果字段的默认值为NULL,查询时条件中带“某字段 IS NULL”则会查询不到数据。所以避免踩坑数据库的字段不要默认为NULL,尽量都设置默认值,db.Select查询条件的WHERE中不要带查询"IS NULL"的语句。