運算符分類與優先級 (高→低)
| 優先級 | 運算符 | 說明 |
| 1 | BINARY, COLLATE | 字元集/排序規則轉換 |
| 2 | NOT, ! | 邏輯非 |
| 3 | ^ | 位異或 |
| 4 | XOR | 邏輯異或 |
| 5 | - (一元), ~ | 負號、位取反 |
| 6 | *, /, % | 乘除模 |
| 7 | +, - | 加減 |
| 8 | <<, >> | 位左移/右移 |
| 9 | & | 位與 |
| 10 | | | 位或 |
| 11 | =, <=>, !=, <>, <, <=, >, >=, IN, IS, LIKE, REGEXP | 比較運算 |
| 12 | BETWEEN, CASE, WHEN, THEN, ELSE | 範圍/條件 |
| 13 | AND, && | 邏輯與 |
| 14 | OR, || | 邏輯或 |
| 15 | := | 賦值 |
關鍵比較運算符細節
<=>:NULL 安全等值,NULL <=> NULL 為真
IN (val1,val2...):集合成員檢查
BETWEEN a AND b:含邊界
LIKE:% 任意長度、_ 單字元、預設不區分大小寫
REGEXP:正則表達式匹配
IS NULL / IS NOT NULL:唯一能判斷 NULL 的標準方式
隱式類型轉換規則
1 + '2' → 1 + 2 = 3 (字串轉數值)
1 + 'abc' → 1 + 0 = 1 (非數值字串轉 0)
'2023-01-01' + 0 → 20230101 (日期轉數值)
DATE '2023-01-01' + INTERVAL 1 DAY → 日期運算
陷阱與最佳實踐
- 索引失效首因:
WHERE varchar_col = 123 觸發隱式轉換,索引不生效 → 寫 '123'
- 超範圍/非法值:MySQL 會截斷或轉 0 並發 Warning,需用
SHOW WARNINGS 捕獲
- 明確轉換:用
CAST(expr AS TYPE)、CONVERT(expr, TYPE) 讓意圖可見
- 字串比較:非二進制字串按字符集排序規則 (通常不區分大小寫);二進制字串 (BLOB/BINARY) 按字節值比較 (區分大小寫)
快速測試模板
SELECT
1 + '2' AS t1,
1 + 'abc' AS t2,
'abc' = 'ABC' AS case_insensitive,
BINARY 'abc' = 'ABC' AS case_sensitive,
CAST('123' AS UNSIGNED) AS explicit_cast;