我過去的工作總是使用 Oracle 資料庫,而在撰寫 SQL 查詢(例如進行字串比較)時,它會區分英文的大小寫。
以一個例子來說明,假設有一個欄位名為 product_type
,其中可能的值有 Bond
和 BOND
,兩者只在大小寫上有所區別。那麼,如果我們寫 WHERE prod_type = 'Bond'
,則不會找到 prod_type = 'BOND'
的結果。
後來,我有一個朋友在工作上需要使用 SQL,但他只會基礎的部分。因此,我依據自己的經驗,設計了一些含有陷阱的 SQL 題目供他練習。
我深刻的回憶之一,就是在過程中發現了 MySQL 在查詢英文大小寫時的問題。因為他寫的答案有類似上述例子的情況,他寫了 WHERE xxx = 'all_lower_case'
,全小寫。而我記得該欄位是區分大小寫的。他表示在 MySQL 中執行沒有發現問題,即使是大寫的也都能找到。這讓我想到,難道 MySQL 的查詢並不區分大小寫?
原因
經過一番探索,我發現問題出在 MySQL collation。
在創建資料庫時,我們可以設定 Collation。如果後綴是 cs
,則會區分大小寫;如果是 ci
,則不區分。
Suffix | Meaning |
---|---|
_ai | Accent-insensitive |
_as | Accent-sensitive |
_ci | Case-insensitive |
_cs | Case-sensitive |
_ks | Kana-sensitive |
_bin | Binary |
儘管我們可以將其設定為不區分大小寫,我個人仍偏向在撰寫 SQL 時預設為區分大小寫,當然也要注意避免在撈多了 data 的情況。
References
https://dev.mysql.com/doc/refman/8.0/en/charset-collation-names.html