MySQL 查詢是否區分大小寫?

創建 MySQL database 時可以設定 Collation, 如果後綴是 cs 便是區分大小寫,若是 ci 則不區分。

我過去的工作總是使用 Oracle 資料庫,而在撰寫 SQL 查詢(例如進行字串比較)時,它會區分英文的大小寫。

以一個例子來說明,假設有一個欄位名為 product_type,其中可能的值有 BondBOND,兩者只在大小寫上有所區別。那麼,如果我們寫 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

在 DBeaver 中建立 MySQL 資料庫時,可以選擇所需的 Collation

儘管我們可以將其設定為不區分大小寫,我個人仍偏向在撰寫 SQL 時預設為區分大小寫,當然也要注意避免在撈多了 data 的情況。

References

https://dev.mysql.com/doc/refman/8.0/en/charset-collation-names.html

comments powered by Disqus