前言
Q:这2个sql执行结果一样吗?(说明:sc_view_statement_detail是一个视图,receive_amount字段可能存在空值)
`SELECT receive_amount FROM sc_view_statement_detail
WHERE receive_amount <= 20;
SELECT receive_amount FROM sc_view_statement_detail
WHERE receive_amount <= '20';`
sc_view_statement_detail 是一个视图,这里简化之后如下
`create view sc_view_statement_detail as
select receive_amount from a where b>0
union all
selelct '' as receive_amount from a where b<=0`
A:不一定
这是在一次开发过程中发现的一个问题,下面来分析看看mysql是如果进行处理的
分析
先来看看上面二个sql输出的结果
`**SELECT receive_amount FROM sc_view_statement_detail
WHERE receive_amount <= 20;**`
输出:
`**SELECT receive_amount FROM sc_view_statement_detail
WHERE receive_amount <= '20';**`
输出:
是的,你没有看错,查询的结果有receive_amount=100
通常mysql会把字符串转化成整形再进行处理,这里明显是'20'没有进行转化,来看一个类型的sqlselect '10100'<='20';
返回0,这里mysql进行字符串之间的比较
**1的ASCII码是49,2的ASCII码50,49<50,比较结束,返回0
所以'10100' < '20'
mysql字符串之间的比较其实是字符的ASCII码之间的比较**
上面也提到了sc_view_statement_detail中的receive_amount字段可能存在空值,导致了mysql将receive_amount字段是视为一个字符串类型,不会将'20'转化成20
解决办法:在代码中先将'20'转化成20再查询
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。