預設 MySQL 的表和 query 是不分大小寫的。 (對,並不是所有資料庫都這樣)
舉個例子,下面有張表 records 兩筆資料 code
大小寫不同。
id | code |
---|---|
1 | f23b |
2 | F23b |
SELECT * FROM records WHERE code = 'F23B';
執行結果如下,兩筆資料都會被撈到,表示 MySQL 不會去區分大小寫的不同!
mysql> select * from records where code = 'F23B';
+----+------+
| id | code |
+----+------+
| 1 | f23b |
| 2 | F23b |
+----+------+
2 rows in set (0.00 sec)
在要區分大小寫的條件欄位前加上 BINARY
就可以解決
SELECT * FROM records WHERE BINARY code = 'F23B';
執行結果如下,因為沒有完全匹配的紀錄,所以撈出 0 筆資料
mysql> select * from users where binary code = 'F23B';
Empty set (0.00 sec)
在 Laravel 中就會是這樣下:
$code = "F23B";
$records = Record::whereRaw('BINARY `code` = ?', $code)->get();
另外,如果要把大小寫不同但字母一樣的字串當作 primary key ,在寫入資料庫時也會有問題。例如,f23b
和 F23b
就會被視為是一樣的,所以會寫入失敗。
BINARY
is a built-in keyword that after yourWHERE
clause that forces a comparison for an exact case-sensitive match.As a side note, you can also make columns case-sensitive by adding the
BINARY
keyword when you create your table.
這段忘記當初是在哪串討論節錄的,但我覺得講的很清楚。
總之 MySQL 預設是 non case sensitive;如果有需求,可以在搜尋或創建表時就特別設定。
另外,並不是每個資料庫軟體都是這樣,像 Oracle 就是 case sensitive。可以看看這篇,有很清楚的比較!