【问题标题】:Single quotes affecting the calculations in Select query影响 Select 查询中计算的单引号
【发布时间】:2011-07-07 05:03:01
【问题描述】:
SELECT COUNT(*) FROM area
WHERE ROUND(SQRT(POWER(('71' - coords_x), 2) +
                 POWER(('97' - coords_y), 2))) <= 17

==> 51

SELECT COUNT(*) FROM area
WHERE ROUND(SQRT(POWER((71 - coords_x), 2) +
                 POWER((97 - coords_y), 2))) <= 17

==> 22

coords_x 和 coords_y 都是 TINYINT 字段,包含 [1, 150] 范围内的值。通常 MySQL 不关心是否引用了数字.. 但显然在这种情况下它确实如此。

问题只是:为什么?

【问题讨论】:

  • 另一个问题是:为什么要将数字视为字符串?
  • 我看不出它的原因,但您可以尝试稍微颠倒一下……在 WHERE 子句中选择您要比较的值,然后查看值是什么在这两种情况下?

标签: mysql


【解决方案1】:

MySQL总是关心数据类型。发生的情况是您的代码依赖于自动类型转换并对字符串(可以包含或不包含数字)执行数学运算。这可能会导致各种不可预知的结果:

SELECT POW('Hello', 'World') -- This returns 1

总结一下:您需要学习和使用 MySQL 提供的不同数据类型。否则,您的应用程序将永远不会进行可靠的计算。

更新:

更多提示:

TINYINT[(M)] [未签名] [ZEROFILL]

一个非常小的整数。有符号范围 是 -128 到 127。无符号范围是 0 到 255。

网址: http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html

我希望您不要尝试将 150 存储在已签名的 tinyint 列中。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2012-04-27
    • 2011-04-24
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多