java Select count(*)返回一行,即使我不希望返回该行
因此,我从java应用程序中查询MySql数据库,并尝试使用一个查询
Select count(*) from table where `NUMERIC`='1'
对数据库中的行进行计数。当我运行这个查询时,它工作得很好,并且返回了一个1(我使用的测试数据库有12条记录,Numeric
的值为1-12,所以这是有意义的)。然而,我想尝试打破这一点,并做一些错误处理。我将查询改为
Select count(*) from table where `Numeric`='1adjfa'
我希望它返回0,但它仍然返回1。事实上,只要我在值的开头有1,它就会工作,如果我将值更改为'adjfa',它就会返回0。我已经通过Java应用程序和MySQL工作台确认了这一点。你知道为什么它会返回1吗,即使它的末尾有垃圾
# 1 楼答案
可以比较两种不同的数据类型而不是。相反,需要将其中一个强制转换为与另一个相同的数据类型
在您的情况下,您没有执行强制,因此DB引擎正在执行隐式强制
数据库引擎根据数据类型的优先顺序选择要强制为数字的字符串
因此,值
'1adjfa'
变成了1
,然后进行比较此结果实际上是您的查询:
你要么不应该比较数字和字符串,要么自己强制,例如
关于打破查询,我希望在你的应用程序中,你实际使用的是参数化查询。这将允许您定义参数的数据类型,如果提供了错误的数据类型,应用程序将抛出错误
# 2 楼答案
Numeric
有一个数字数据类型。为了与1adjfa
进行比较,DB引擎尝试将其也转换为一个数字,这将导致1
,其余部分被切断