mysql的比較運算

5up3rh3iblog


在menzhi007的blog裡看到非常有意思的東西:


/database/201003/45293.html


在mysql手冊裡:


http://www.phpchina.com/manual/mysql/functions.html#comparison-operators


MySQL按照以下規則進行數值比較:



  • 若有一個或兩個參數為 NULL,除非NULL-safe <=> 等算符,則比較運算的結果為NULL。
  • 若同一個比較運算中的兩個參數都是字符串,則按照字符串進行比較。
  • 若兩個參數均為整數,則按照整數進行比較。
  • 十六進制值在不需要作為數字進行比較時,則按照二進制字符串進行處理。
  • 假如參數中的一個為 TIMESTAMP 或 DATETIME 列,而其它參數均為常數, 則在進行比較前將常數轉為 timestamp。這樣做的目的是為瞭使ODBC的進行更加順利。 註意,這不適合IN()中的參數!為瞭更加可靠,在進行對比時通常使用完整的 datetime/date/time字符串。
  • 在其它情況下,參數作為浮點數進行比較。  

在默認狀態下,字符串比較不區分大小寫,並使用現有字符集(默認為cp1252 Latin1,同時對英語也適合)。


為瞭進行比較,可使用CAST()函數將某個值轉為另外一種類型。 使用CONVERT()將字符串值轉為不同的字符集。請參見12.8節,“Cast函數和操作符”


以下例子說明瞭比較運算中將字符串轉為數字的過程:


mysql> SELECT 1 > 6x;


        -> 0


mysql> SELECT 7 > 6x;


        -> 1


mysql> SELECT 0 > x6;


        -> 0


mysql> SELECT 0 = x6;


        -> 1


這個如果不註意好確實可以導致安全問題的,比如menzhi007裡舉的那個列子,如果字符變量查詢沒有引號,但是用某些函數過濾瞭不可以直接註射,那麼可以直接提交0就可以繞過瞭…


最後感謝menzhi007及hi群的各大牛的討論,尤其是ryat牛的指點:)

You May Also Like