MySQL 如何强制 MySQL LIKE 区分大小写?
在 MySQL 中使用 LIKE 进行模糊查询时,默认是不区分大小写的。比如,使用以下 SQL 语句进行查询:
SELECT * FROM users WHERE name LIKE 'john%';
那么,无论 “John” 还是 “JOHN” 还是 “john”,都会被匹配到。但是,如果我们想要强制进行大小写区分呢?
阅读更多:MySQL 教程
方法一:使用 BINARY 操作符
在执行 LIKE 时,可以使用 BINARY 操作符,将字符串的比较转化为二进制比较,从而实现大小写的区分。
例如,查询 name 字段以 “john” 开头的记录,但是仅匹配 “john” 这个单词而非 “johnny”:
SELECT * FROM users WHERE BINARY name LIKE 'john%';
运行结果:
+----+------------+--------+
| id | name | gender |
+----+------------+--------+
| 1 | John Smith | male |
+----+------------+--------+
其中 BINARY 操作符会将 name 字段的值转化为二进制进行比较,只有与模式完全匹配的记录才会被返回。
方法二:修改数据库字符集
另一种方法是在数据库创建时,将字符集设定为大小写敏感的,比如 utf8_bin。这种方式可以在全局范围内强制 MySQL 区分大小写。需要注意的是,如果修改字符集时数据库中已经有数据,那么修改后已有的数据将无法直接使用。可以考虑备份原有数据,然后在新的数据库上进行修改。
以下是修改字符集的 SQL 语句:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
在该语句中,字符集为 utf8mb4,COLLATE 参数指定了使用的排序规则(bin 表示大小写敏感)。
方法三:使用 REGEXP
在 MySQL 中,也可以使用 REGEXP 正则表达式进行模糊查询。REGEXP 是大小写敏感的,因此可以实现大小写区分。例如,查询以 “john” 开头的记录,同时排除以 “johnny” 开头的记录:
SELECT * FROM users WHERE name REGEXP '^john[A-Za-z]*$';
说明:^ 表示字符串的开头,[A-Za-z] 表示大小写字母,* 表示任意数量的字母。因此,该语句可以匹配 “John”、”johnDoe”、”johnny” 不匹配。
方法四:使用 COLLATE 关键字
除了上述方法外,MySQL 中还可以使用 COLLATE 关键字,手动指定排序规则。比如,查询以 “john” 开头的记录,同时忽略 “johnny” 这个单词:
SELECT * FROM users WHERE name COLLATE utf8mb4_bin LIKE 'john%';
说明:utf8mb4_bin 是大小写敏感的排序规则。
结论
以上介绍了在 MySQL 中强制 LIKE 区分大小写的方法,包括使用 BINARY 操作符、修改数据库字符集、使用 REGEXP 和使用 COLLATE 关键字。具体使用哪种方式,取决于具体情况,可以根据实际需求选择合适的方法。