所以我从我的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 App和MySQL工作台证实了这一点。关于为什么这会返回1的任何想法,即使在它的末尾有垃圾?
答案 0 :(得分:4)
可以不比较两种不同的数据类型。相反,两者中的一个需要被投射/强制转换为与另一个相同的数据类型。
在您的情况下,您没有进行强制操作,因此数据库引擎正在进行隐式强制。
基于数据类型优先顺序,数据库引擎选择要强制转换为数字的字符串。
值'1adjfa'
因此变为1
, 然后 正在进行比较。
此结果是您的查询有效:
Select count(*) from table where `Numeric` = 1
你应该不要比较数字和字符串,或者自己做强制,例如......
Select count(*) from table where CAST(`Numeric` AS VARCHAR(32)) = '1adjfa'
在打破查询方面,我希望您的应用程序中实际上使用参数化查询。这将允许您定义参数的数据类型,如果提供了错误的数据类型,您的应用程序应抛出错误。
答案 1 :(得分:3)
Numeric
具有数字数据类型。要与1adjfa
进行比较,数据库引擎会尝试将其转换为导致1
的数字,其余数据会被截断。