一、 问题原因
同事项目出现Bug,让我看看,项目在运行过程中一直出现同一条数据,而将sql在数据库执行是正常的,没有查到任何数据,但项目执行始终有一条数据,那这条数据怎么产生的呢?
二、排查问题
先排查是否链接数据库不对,排查正常,在排查是否存在缓存,排查没有,然后排查sql语句,sql排查了许久发现,传入给sql语句条件的占位符参数是""132456""这样的,而条件比较字段类型是int类型,最终查询出字段为0的数据
三、为什么会这样呢?
测试如下:
mysql> select 'sss' = 0;
+-----------+
| 'sss' = 0 |
+-----------+
| 1 |
+-----------+
1 row in set
mysql> select '0sss' = 0;
+------------+
| '0sss' = 0 |
+------------+
| 1 |
+------------+
1 row in set
mysql> select '01sss' = 0;
+-------------+
| '01sss' = 0 |
+-------------+
| 0 |
+-------------+
1 row in set
mysql> select '013sss' = 13
;
+---------------+
| '013sss' = 13 |
+---------------+
| 1 |
+---------------+
1 row in set
mysql> select '113sss' = 13;
+---------------+
| '113sss' = 13 |
+---------------+
| 0 |
+---------------+
1 row in set
查询通过查看MySQL给出的警告,都可以看到类似如下的信息
mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '113sss' |
+---------+------+--------------------------------------------+
1 row in set
官方文档中关于比较的章节,其中说明Comparison operations result in a value of 1 (TRUE), 0 (FALSE), or NULL. These operations work for both numbers and strings. Strings are automatically converted to numbers and numbers to strings as necessary.
。也就是说字符串根据需要自动转换为字符串和数字。
mysql> select cast('123ab
c' as signed);
+--------------------------+
| cast('123abc' as signed) |
+--------------------------+
| 123 |
+--------------------------+
1 row in set
mysql> select cast('1h
23abc' as signed);
+---------------------------+
| cast('1h23abc' as signed) |
+---------------------------+
| 1 |
+---------------------------+
1 row in set
mysql> select cast('
abc' as signed);
+-----------------------+
| cast('abc' as signed) |
+-----------------------+
| 0 |
+------------
由此可见转换类型时,从左往右开始截取,如果有则截取出来,遇到不能转换的就终止,如果从开头就没有截取到匹配类型结果自然就是0。
Comparison operations result in a value of 1 (TRUE), 0 (FALSE), or NULL.
网友评论