Laravel配置ALLOW_INVALID_DATES后查询'0000-00-00'仍报错如何解决?
问题原因
高版本MySQL(8.0及以上)中,即便开启了ALLOW_INVALID_DATES模式,在执行日期大小比较逻辑时,仍会对'0000-00-00'这类无效日期值触发校验报错。你此前的配置未生效,通常是因为session级的sql_mode设置未覆盖到实际执行查询的数据库连接,或是修改配置后未清理Laravel缓存导致旧配置仍在生效。
可行解决方案
方案1:修改查询逻辑,避开无效日期直接比较
不用修改任何配置,将查询中判断p.sell_date = '0000-00-00'的条件替换为DATE(p.sell_date) = 0即可,无效0日期在MySQL中转换为数值后结果为0,匹配逻辑完全一致。修改后的查询条件片段如下:and (`p`.`sell_date` is null or DATE(`p`.`sell_date`) = 0 or `p`.`sell_date` > now())方案2:固定数据库连接的sql_mode配置
不要在业务代码中手动执行set session语句,直接在Laravel的数据库配置文件中固定mode配置,确保所有连接都生效。修改config/database.php中mysql连接的配置项:'mysql' => [ // 原有其他配置保持不变 'strict' => false, 'modes' => [ 'ALLOW_INVALID_DATES', // 如需保留其他默认mode可以继续往下加,仅解决当前问题只加这一项即可 ], ]修改完成后执行命令清理配置缓存:
php artisan config:clear方案3:规范存量数据,从根源避免问题
用'0000-00-00'作为未销售的标记本身属于不规范的数据库设计,你可以直接将存量的无效日期更新为NULL,后续完全不需要额外配置支持。执行数据更新SQL:UPDATE portfolio_holding SET sell_date = NULL WHERE sell_date = '0000-00-00';数据更新完成后,直接删除查询条件中
p.sell_date = '0000-00-00'的判断即可,后续不会再出现同类报错。
内容的提问来源于stack exchange,提问作者DS9
相关产品推荐
相关产品推荐

