
在 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 字符集大小写敏感的问题。
发表评论
沙发空缺中,还不快抢~