2014-02-10 55 views
2

我看過一些程序員使用這個條件0='"="1',不知道它爲什麼會返回true?任何人都可以解釋給我嗎?謝謝!爲什麼這個條件0 ='= 1'是真的?

+0

有些程序員?真? –

+1

的確如此。問題是......實際上使用這種情況的人值得使用WAT? (https://www.destroyallsoftware.com/talks/wat) –

回答

4

爲了將數字與字符串進行比較,字符串被轉換爲數字。

當將一個字符串轉換爲一個數字時,mysql接受所有前導數字並丟棄其餘數字。如果沒有領先的數字,字符串轉換爲爲零:

0 = 'abc' -- true: string cast to 0 
1 = '1abc' -- true: string cast to 1 

你的字符串被評估爲0,因爲沒有領先的數字。

+0

我正在刪除我的答案,因爲你的顯着更好。 RHS是否總是轉換爲LHS的類型? '''= 0'是否評估爲真? – Gray

+1

@Gray哎呀!你的例子很好:'''= 0'是真的,所以我改變了我的第一句話。 – Bohemian

+0

哦,很酷。感謝您的檢查。難道這不就是說,當它是一個字符串時'0'被轉換爲''''?我不是想說你錯了,只是想了解它是如何選擇投射的。我認爲有一些優先順序,但是你提到它必須與側面相關。我找不到任何說你錯了的東西。 – Gray

1

該問題與字符串的「異常」外觀無關。是。它只是原始的隱式類型轉換。你可以這樣做:

 
mysql> select 0='blablabla'; 
+---------------+ 
| 0='blablabla' | 
+---------------+ 
|    1 | 
+---------------+ 
1 row in set, 1 warning (0.00 sec) 

,看看你的理由:

 
mysql> show warnings; 
+---------+------+-----------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+-----------------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'blablabla' | 
+---------+------+-----------------------------------------------+ 
1 row in set (0.00 sec) 

所以你'"="1'一樣 - 它只是串並轉換過程中被截斷DOUBLE導致零值。