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


<<:  前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day4 制作标题导览列

>>:  铁人赛 Day4 -- 一定要知道的 CSS (一)

[Day 14] - 『转职工作的Lessons learned』 - Docker Build Issue

今天的笔记应该算是日常初阶工程师会发生的问题,以及可以怎麽去找根因的一些做法,不外乎就是下好关键字,...

[Day 最後一天]心得感想

终於结束了!! 一开始以为 30 天可以咻的一声就过去了 没想到真的十分的不容易呀 更尤其是这中间居...

Day 19:专案管理

前言 专案管理是一门很深的学问,也不只是软件业,各行各业都有,最早是来自土木建筑、国防领域。 牵扯到...

[Day 25] 实作 Redis Plugin 整合 Redis Coroutine Client

目前 Redis 几乎已成为後端微服务架构的必备基础设施,但是 Ktor 官方连 ORM 都没有整合...

成为 Scrum Master:更基本的部分

前言 接着昨天分享的话题,针对成为 Scrum Master 的经历与想法再进行补充。 大家从标题「...