0%

MySQL忽略大小写问题

MySQL 大小写敏感问题详解:从字符集到实际应用

MySQL 中字符串查询的大小写敏感行为,主要由字符集的校对规则(Collation) 决定,而非字符集本身。查询返回 aA 两条记录的问题,正是由于默认校对规则 utf8_general_ci 不区分大小写导致的。本文详细解析这一机制及解决方案。

核心概念:字符集与校对规则

字符集(Character Set)

定义字符的编码方式(如 utf8utf8mb4),决定如何存储字符(如 a 存储为 0x61A 存储为 0x41)。

校对规则(Collation)

定义字符的比较规则,决定如何判断两个字符是否相等。大小写敏感行为由校对规则控制,而非字符集。

常见的 utf8 系列校对规则:

  • utf8_general_cici 即 Case-Insensitive(不区分大小写),aA 被视为相等。
  • utf8_binbin 即 Binary(二进制比较),严格区分大小写,a0x61)与 A0x41)被视为不同。
  • utf8_unicode_ci:不区分大小写,但比 utf8_general_ci 更符合 Unicode 标准(如支持德语、法语特殊字符的正确排序)。

默认规则

  • 当指定字符集为 utf8 而未指定校对规则时,MySQL 会自动使用默认校对规则 utf8_general_ci(不区分大小写),这就是你遇到问题的原因。

查询当前字符集与校对规则

查看数据库的字符集和校对规则

1
2
3
4
5
6
-- 查看所有数据库的配置
SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.schemata;

-- 查看指定数据库(如 db1)
SHOW CREATE DATABASE db1;

查看表的字符集和校对规则

1
2
3
4
5
-- 方法 1:查看表状态
SHOW TABLE STATUS FROM 数据库名 LIKE '表名';

-- 方法 2:查看表创建语句(更直观)
SHOW CREATE TABLE 表名;

查看字段的字符集和校对规则

1
2
-- 查看表中所有字段的详细配置
SHOW FULL COLUMNS FROM 表名;

输出中 Collation 列即为该字段的校对规则(如 utf8_general_ciutf8_bin)。

修改大小写敏感行为的方法

根据需求,可通过修改数据库、表或字段的校对规则,设置大小写敏感(utf8_bin)或不敏感(utf8_general_ci)。

修改数据库级别的校对规则

1
2
-- 语法:ALTER DATABASE 数据库名 DEFAULT COLLATE 校对规则;
ALTER DATABASE mydb DEFAULT COLLATE utf8_bin;
  • 影响:新创建的表会继承该数据库的校对规则(已有表不受影响)。

修改表级别的校对规则

1
2
-- 语法:ALTER TABLE 表名 DEFAULT COLLATE 校对规则;
ALTER TABLE good DEFAULT COLLATE utf8_bin;
  • 影响:表的默认校对规则改变,但已有字段的校对规则需单独修改(除非重新创建字段)。

修改字段级别的校对规则(最常用)

字段的校对规则优先级最高,会覆盖表和数据库的默认设置:

1
2
3
4
5
6
-- 语法:ALTER TABLE 表名 MODIFY 字段名 类型 CHARACTER SET 字符集 COLLATE 校对规则;
-- 示例:修改 good 表的 name 字段为 utf8_bin(区分大小写)
ALTER TABLE good
MODIFY name VARCHAR(100) -- 字段类型需与原类型一致(如原长度为100)
CHARACTER SET utf8
COLLATE utf8_bin;

注意:MODIFY 会保留字段数据,但需确保新类型与原类型兼容(如长度不小于原长度)。

临时修改查询的大小写敏感性

若仅需单次查询区分大小写,可在查询中指定校对规则:

1
2
3
4
5
-- 强制使用 utf8_bin 进行比较(区分大小写)
SELECT * FROM good WHERE name = 'a' COLLATE utf8_bin;

-- 强制使用 utf8_general_ci 进行比较(不区分大小写)
SELECT * FROM good WHERE name = 'a' COLLATE utf8_general_ci;

注意事项

  1. utf8utf8mb4 的选择
    • MySQL 的 utf8 实际是 utf8mb3,仅支持 3 字节字符(不包含 Emoji)。
    • 推荐使用 utf8mb4 及对应的校对规则(如 utf8mb4_binutf8mb4_general_ci),支持所有 Unicode 字符。
  2. 修改校对规则的影响
    • 会导致基于该字段的索引重建(可能耗时,建议离线操作)。
    • 若字段已存在数据,需确保应用程序兼容新的大小写规则(如查询条件是否需要调整)。
  3. 大小写敏感与业务逻辑
    • 区分大小写的场景:用户名、密码(如 User123user123 是不同用户)。
    • 不区分大小写的场景:商品名称搜索(如用户输入 iphone 应匹配 iPhone)。

欢迎关注我的其它发布渠道