MySQL 字符集与大小写敏感性解析
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
鲁飞
扫码关注公众号
扫码阅读
手机扫码阅读
在 MySQL 数据库中,UTF-8 及其变体是最常用的字符集。
不同的 UTF-8 编码可能对大小写敏感性产生影响,主要包括以下几种:
utf8:MySQL 早期的 UTF-8 实现,最多支持 3 字节,无法存储部分 Emoji 字符。utf8mb4:MySQL 5.5+ 版本推荐使用的 UTF-8 编码,最多支持 4 字节,能够完整存储所有 Unicode 字符。
字符集与排序规则(Collation)
MySQL 字符集搭配不同的排序规则(Collation)可能会影响查询的大小写敏感性。
常见的排序规则包括:
utf8_general_ci/utf8mb4_general_ci:不区分大小写(Case Insensitive,ci代表 Case Insensitive)。utf8_bin/utf8mb4_bin:区分大小写(Binary,bin代表按二进制存储,严格区分大小写)。utf8_unicode_ci/utf8mb4_unicode_ci:更符合 Unicode 规范的排序方式,不区分大小写。
默认情况下,utf8_general_ci 和 utf8mb4_general_ci 在搜索时是不区分大小写的。
MySQL 大小写搜索问题
当 MySQL 表的字符集设置为 utf8_general_ci 或 utf8mb4_general_ci 时,使用 LIKE 或 = 进行查询时,默认是不区分大小写的。
例如:
SELECT * FROM users WHERE username = 'admin';
如果数据库中存储了 Admin、ADMIN 等,查询会返回这些所有匹配项。
如果需要执行区分大小写的查询,则需要:
修改排序规则(Collation)
ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
这样查询就会严格区分 admin 和 Admin。
使用 BINARY 关键字
SELECT * FROM users WHERE BINARY username = 'admin';
这样 admin 只会匹配完全相同的字符串,而不会匹配 Admin、ADMIN 等。
在 ThinkPHP 框架中使用 whereRaw 进行原生查询
在 ThinkPHP 框架中,默认的 where 方法不支持直接使用 BINARY 进行查询,但可以通过 whereRaw 方法执行 MySQL 原生查询。
$result = Db::table('users') ->whereRaw("BINARY username = ?", ['admin']) ->find(); $result = Db::table('users') ->whereRaw("BINARY username LIKE ?", ['%admin%']) ->select();
这种方法可以避免默认的大小写不敏感查询,让 MySQL 进行更严格的匹配。
总结
MySQL 的 utf8_general_ci和utf8mb4_general_ci默认不区分大小写。需要区分大小写时,可以修改排序规则(Collation)或使用 BINARY关键字。在 ThinkPHP 框架中,可以使用 whereRaw方法执行 MySQL 原生查询,确保大小写敏感匹配。
这样,你就可以在 ThinkPHP 框架中更灵活地处理 MySQL 字符集大小写敏感的问题。
鲁飞
鲁飞
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
鲁飞的其他文章
张嘴吃安利之 PhpStorm 中的 HTTP 客户端
安利一下 PhpStorm 中的 HTTP 客户端
为 Docsify 自动生成 RSS 订阅
为Docsify等静态站点自动生成RSS订阅
MQTT 怎么在单独一个端口上分别使用 v3.x 和 v5.0 协议解析?
在 1883 端口上,同时处理 v3.1、v3.1.1 和 v5.0 这 3 种协议等级
使用 acme.sh 自动申请并更新泛域名证书
通过 acme.sh,不仅可以快速申请泛域名证书,还能轻松实现自动更新,降低了 SSL 证书管理的复杂度。
GitHub Actions 真香系列之自动同步镜像仓库
GitHub虽然在国内访问慢,但是依旧不能阻挠国内开发者的使用,我们一般也会在Gitee或者其他托管平台创建一个镜像,用来方便不能正常访问GitHub的开发者。
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线