前言

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;**`
输出:
image.png
`**SELECT receive_amount FROM sc_view_statement_detail
WHERE receive_amount <= '20';**`
输出:
image.png
是的,你没有看错,查询的结果有receive_amount=100
通常mysql会把字符串转化成整形再进行处理,这里明显是'20'没有进行转化,来看一个类型的sql
select '10100'<='20';
image.png
返回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再查询


小小的太阳
123 声望7 粉丝

reloading...