有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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吗,即使它的末尾有垃圾


共 (2) 个答案

  1. # 1 楼答案

    可以比较两种不同的数据类型而不是。相反,需要将其中一个强制转换为与另一个相同的数据类型

    在您的情况下,您没有执行强制,因此DB引擎正在执行隐式强制

    数据库引擎根据数据类型的优先顺序选择要强制为数字的字符串

    因此,值'1adjfa'变成了1,然后进行比较

    此结果实际上是您的查询:

    Select count(*) from table where `Numeric` = 1
    

    你要么不应该比较数字和字符串,要么自己强制,例如

    Select count(*) from table where CAST(`Numeric` AS VARCHAR(32)) = '1adjfa'
    


    关于打破查询,我希望在你的应用程序中,你实际使用的是参数化查询。这将允许您定义参数的数据类型,如果提供了错误的数据类型,应用程序将抛出错误

  2. # 2 楼答案

    Numeric有一个数字数据类型。为了与1adjfa进行比较,DB引擎尝试将其也转换为一个数字,这将导致1,其余部分被切断