iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Modern Web

工作後才知道的後端 30 件小事系列 第 4

MySQL:如何讓 query 區分大小寫

前言

預設 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

在要區分大小寫的條件欄位前加上 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 ,在寫入資料庫時也會有問題。例如,f23bF23b 就會被視為是一樣的,所以會寫入失敗。

小結

BINARY is a built-in keyword that after your WHERE 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。可以看看這篇,有很清楚的比較!

Reference


上一篇
資料庫:什麼是 unsigned integer
下一篇
匯入大量資料到 docker 上的資料庫:mysql-client
系列文
工作後才知道的後端 30 件小事20

尚未有邦友留言

立即登入留言