背景
今天在查询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)结尾的。