MySQL 的隱式類型轉換

jopen 9年前發布 | 11K 次閱讀 MySQL

MySQL 的隱式類型轉換

隱式類型轉換有無法命中索引的風險,在高并發、大數據量的情況下,命不中索引帶來的后果非常嚴重。將數據庫拖死,繼而整個系統崩潰,對于大規模系統損失慘重。

MySQL 的隱式類型轉換原則:

  • 兩個參數至少有一個是 NULL 時,比較的結果也是 NULL,例外是使用 <=> 對兩個 NULL 做比較時會返回 1,這兩種情況都不需要做類型轉換
  • 兩個參數都是字符串,會按照字符串來比較,不做類型轉換
  • 兩個參數都是整數,按照整數來比較,不做類型轉換
  • 十六進制的值和非數字做比較時,會被當做二進制串,和數字做比較時會按下面的規則處理
  • 有一個參數是 TIMESTAMP 或 DATETIME,并且另外一個參數是常量,常量會被轉換為 timestamp
  • 有一個參數是 decimal 類型,如果另外一個參數是 decimal 或者整數,會將整數轉換為 decimal 后進行比較,如果另外一個參數是浮點數,則會把 decimal 轉換為浮點數進行比較
  • 所有其他情況下,兩個參數都會被轉換為浮點數再進行比較

注意一個安全問題:假如 password 類型為字符串,查詢條件為 int 0 則會匹配上。

由于 MySQL 隱式類型轉換規則比較復雜,依賴 MySQL 隱式轉換很容易出現各種想想不到的問題,而且 MySQL 隱式類型轉換本身也是非常耗費 MySQL 服務器性能的,所以非常不推薦這樣使用

來源: http://blog.eood.cn/mysql_params

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!