MySQL使用LIKE '%string%'通配符搜索是否默认不区分大小写?
MySQL大小写敏感性规则说明
你观察到的差异是正常现象,并非操作失误。MySQL的大小写敏感行为不是全局固定的,默认逻辑由字符集排序规则(collation)、运行的操作系统、所用存储引擎三个维度共同决定,和BigQuery的默认规则存在差异。
核心原理:排序规则决定大小写敏感属性
MySQL的库、表、单独的字段都可以独立设置排序规则,主流默认排序规则为utf8mb4_general_ci(MySQL 5.x版本)或utf8mb4_0900_ai_ci(MySQL 8.0+版本),规则后缀中的ci就是 Case Insensitive(大小写不敏感) 的标识,这就是你测试时LIKE '%Park%'可以同时命中park、PARK、Park等多种大小写格式数据的核心原因。
如果排序规则后缀为cs(Case Sensitive,大小写敏感)或bin(二进制字节比对),那么查询时就会严格区分大小写,表现和你在BigQuery中看到的结果一致。
存储阶段的大小写处理逻辑
- 采用
ci后缀的不敏感排序规则时,MySQL会完整保留你写入数据的原始大小写,仅在字符串比对、排序操作时忽略大小写差异 - 采用
bin后缀的二进制排序规则时,会直接按字符的二进制编码做严格比对,存储和查询阶段都严格区分大小写
不同数据库的行为对齐方案
要让BigQuery实现和MySQL默认一致的不区分大小写匹配,可以用两种写法:
- 统一转大小写后比对:
WHERE LOWER(name) LIKE '%park%' - 用正则匹配的忽略大小写参数:
WHERE REGEXP_CONTAINS(name, r'park', 'i')
要让MySQL实现和BigQuery一致的区分大小写匹配,可以临时指定排序规则:
SELECT * FROM 你的表名 WHERE name LIKE '%Park%' COLLATE utf8mb4_bin;
补充小提示:你示例中的条件
name = '%Park%'存在语法问题,通配符%只有搭配LIKE关键字才会生效,用=时%会被识别为普通字符,仅能匹配完全等于%Park%的内容,建议修正为name LIKE '%Park%'。
内容的提问来源于stack exchange,提问作者Jul
相关产品推荐
相关产品推荐

