2012-02-24 95 views
0

以前從未遇到過,只是無法理解它背後的推理。MySQL選擇查詢語法

我有一個查詢:

SELECT * FROM (`user`) WHERE `user_email` = 0 AND `user_pass` = 0 

這說明所有的行,即使我已閱讀查詢作爲「告訴我這有兩個USER_EMAIL和user_pass整數0,所有記錄。我可以通過確保字符串數據從PHP傳到這裏來解決這個問題,但我是一個完美主義者,想知道爲什麼會發生這種情況以獲得更好的理解。

有沒有人有任何想法?試圖搜索谷歌無濟於事。感謝您的幫助! :)。

謝謝!

回答

1

你把整數0,所以它把你的varchar字段user_emailuser_pass轉換爲int。實際上,如果非空字符串沒有在其上領先的數字,它會被轉換爲0。例如,

SELECT 'aaaa' = 0; // returns 1 - true 
SELECT '1aaa' =0; // 0 -false 
SELECT '1aaa' =1 ;// 1 -true 

校正。根據docs,他們將被比作浮動,而不是整數。

在其他情況下,參數相比,浮點(實)數

0

我不認爲我以前見過有人用圓括號聲明表名。您是否完成了這項工作:

SELECT * FROM `user` WHERE `user_email` = 0 AND `user_pass` = 0 
+0

對不起,內容編輯剝離一些標記,仍然產生所產生的記錄集:S。 – Joe 2012-02-24 23:43:32

0

我不認爲在user附近需要括號。另外,請嘗試將兩個引號置零,這可能會導致問題。

+0

他們arnt導致錯誤,查詢運行相同,沒有他們。我不應該在數據中加引號,因爲它不是一個字符串,而是一個整數。提供1和1而不是0和0不返回任何行,因此它特別關注於0。我只是想了解爲什麼發生這種情況的理論,因爲我已經發展了多年,從未遇到過這種情況。 – Joe 2012-02-24 23:46:11

0

由於USER_EMAIL和user_pass將是字符串類型,我認爲這應該這樣做:

SELECT * FROM user WHERE user_email = '0' AND user_pass = '0' 
+0

這將工作正常,但我不只是想解決問題,因爲這很簡單,我想了解爲什麼0和0返回所有行時,如1另一個int doesnt::S – Joe 2012-02-24 23:50:24

+0

@Joe ahh好吧,大概這可能會略顯一些:http://www.cubrid.org/cubrid_implicit_type_conversion ..有一個類似被測試的MySQL部分。 – Pheonix 2012-02-24 23:57:57

+0

@Joe另一個有用的鏈接:http://dba.stackexchange.com/questions/10771/type-safety-in-where-clauses – Pheonix 2012-02-25 00:01:35

1

我猜你的領域USER_EMAIL和user_pass是VARCHAR字段。所以也許改變0到''(兩個單引號)

+0

好吧我明白你從哪裏來,但它應該沒有引號,提供1和1而不是0和0不返回所有行。 – Joe 2012-02-24 23:47:57