2011-03-02 55 views
0
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都是包含範圍[1,150]中值的TINYINT字段。通常MySQL不關心數字是否被引用,但顯然它在這種情況下。影響Select查詢中計算結果的單引號

問題是:爲什麼?

+3

另一個問題是:爲什麼你想要像字符串對待數字? – Cosmin 2011-03-02 11:27:25

+0

我看不出原因,但可以嘗試稍微反轉一下...在WHERE子句中選擇要比較的值,並查看兩種情況下的值是什麼? – 2011-03-02 11:35:40

回答

0

MySQL always關心數據類型。會發生什麼是你的代碼依賴於自動類型轉換並對字符串執行數學運算(可以保存或不保存數字)。這可能導致所有排序的不可預知的結果:

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

綜上所述:你需要學習並使用不同的數據類型MySQL提供。否則,你的應用程序永遠不會做可靠的計算。

更新:

還有一個提示:

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

一個非常小的整數。符號範圍 是-128到127無符號的範圍是 0到255

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

我希望你是不是嘗試存儲150在簽署TINYINT列。