MySql 忽略大小写的情况

177 阅读2分钟

背景

今天在查询mysql的时候,一个字符字段类型进行匹配的时候进行忽略了大小写,这么神奇的吗?抱着探究的态度就深入了解了一下。

区分大小写的情况

在 MySQL 中,字符串比较是否忽略大小写取决于字符集和排序规则。

当使用的排序规则以 _bin 结尾时,字符串比较是区分大小写的。_bin 排序规则基于字符的二进制值进行比较,每个字符的大小写在二进制层面是不同的,因此会区分大小写。

示例

-- 创建一个示例表,使用区分大小写的排序规则
CREATE TABLE test_table (
    str_col VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
);

-- 插入测试数据
INSERT INTO test_table (str_col) VALUES ('Apple'), ('apple');

-- 进行区分大小写的查询
SELECT * FROM test_table WHERE str_col = 'Apple';

在上述示例中,由于使用了 utf8mb4_bin 排序规则,查询时会严格区分大小写。因此,只有 str_col 字段值为 'Apple' 的记录会被返回,'apple' 不会被返回。

忽略大小写的情况

默认情况下,MySQL 的很多排序规则是忽略大小写的。例如,常见的 utf8mb4_general_ci 和 utf8mb4_unicode_ci 排序规则,其中 _ci 表示大小写不敏感(Case Insensitive)。

示例

-- 创建一个示例表,使用忽略大小写的排序规则
CREATE TABLE test_table_ignore_case (
    str_col VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
);

-- 插入测试数据
INSERT INTO test_table_ignore_case (str_col) VALUES ('Apple'), ('apple');

-- 进行忽略大小写的查询
SELECT * FROM test_table_ignore_case WHERE str_col = 'Apple';

在这个示例中,使用了 utf8mb4_general_ci 排序规则,查询时会忽略大小写。因此,str_col 字段值为 'Apple' 和 'apple' 的记录都会被返回。

修改排序规则

如果你想改变某个字段或整个表的排序规则,可以使用 ALTER TABLE 语句。

示例

-- 修改表的排序规则
ALTER TABLE test_table_ignore_case 
MODIFY str_col VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

上述语句将 test_table_ignore_case 表中的 str_col 字段的排序规则修改为 utf8mb4_bin,之后对该字段的字符串比较将区分大小写。

总结

MySQL 中字符串比较是否忽略大小写由字符集和排序规则决定,通常以_bin结尾的比较规则是区分大小写的,以_ci结尾是不区分大小写的,mysql通常默认的排序规则都是以_ci(case insensitive)结尾的。