MySQL WHERE子句传非法值返回0行不报错,如何调整使其触发错误
问题根因
你遇到的现象由MySQL默认的隐式类型转换规则导致:当INT类型字段和字符串做等值比较时,MySQL会自动将字符串转换为数值后再做匹配,无法转换为合法整数的字符串会被默认转为0。只要你的表中没有KEY_COL = 0的记录,就会返回0行匹配结果。而你已经开启的STRICT_ALL_TABLES仅对INSERT/UPDATE的SET子句中写入的字段值做合法性校验,不会校验WHERE子句中的隐式类型转换。
实现报错的配置方案
调整
sql_mode为TRADITIONAL模式,该模式是MySQL官方提供的严格模式组合,会将所有数据合法性相关的警告直接升级为错误。
临时生效可以执行以下SQL:SET SESSION sql_mode = 'TRADITIONAL,NO_AUTO_CREATE_USER';永久生效需要将以下配置写入MySQL的my.cnf配置文件,重启服务后生效:
[mysqld] sql_mode = TRADITIONAL,NO_AUTO_CREATE_USER配置完成后再执行你提到的UPDATE语句,会直接抛出1292错误:
Truncated incorrect INTEGER value: 'A',不会再返回0行匹配的结果。如果你不想修改数据库全局配置,也可以在应用层提前做入参类型校验,组装SQL前就判断主键传入值的类型是否合法,避免非法值发送到数据库执行。
内容的提问来源于stack exchange,提问作者thebestcappy
相关产品推荐
相关产品推荐

