即使我不期望它,选择count(*)也会返回一行

时间:2014-03-18 15:22:46

标签: java mysql sql

所以我从我的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的任何想法,即使在它的末尾有垃圾?

2 个答案:

答案 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的数字,其余数据会被截断。