同字符集排序规则下,MySQL/MariaDB某表查询为何大小写敏感?
问题分析与解决方案:MariaDB中BLOB字段LIKE查询大小写敏感问题
问题根源
数据库1里issue_head表的nme字段用的是longblob类型——BLOB是二进制存储类型,它只会按字节的原始值做比较,完全不管你给表设置的utf8mb3字符集和utf8mb3_czech_ci排序规则。而数据库2的msg字段是longtext(字符串类型),会老老实实遵循设定的排序规则,所以能自动做大小写不敏感匹配。
你执行like 'test%'时,BLOB字段把'test%'当成二进制字节对比,大小写字母的字节值不一样,自然查不到结果;但当你手动用CONVERT('test%' USING utf8mb3) COLLATE utf8mb3_czech_ci转换条件后,相当于把查询条件转成了符合排序规则的字符串,同时BLOB字段也会被隐式转成字符串类型做比较,所以能匹配到大小写相关的行。
解决方案
方法1:修改字段类型为字符串类型(推荐)
直接把nme字段从longblob改成longtext,这样字段会自动遵循表的字符集和排序规则,不用额外处理就能支持大小写不敏感的LIKE查询:
ALTER TABLE issue_head MODIFY COLUMN nme longtext CHARACTER SET utf8mb3 COLLATE utf8mb3_czech_ci;
⚠️ 注意:修改前一定要做好数据备份,避免转换过程中数据丢失。
方法2:查询时显式转换字段类型
如果没法改字段类型,每次查询时把BLOB字段转成对应字符集的字符串,并指定排序规则:
SELECT * FROM issue_head WHERE CONVERT(nme USING utf8mb3) COLLATE utf8mb3_czech_ci LIKE 'test%' AND appID = 23;
❌ 缺点:这种转换会让字段上的索引失效,如果数据量较大,查询速度会变慢。
方法3:调整二进制比较规则(不推荐)
要是非要保留BLOB类型,也可以尝试调整lower_case_table_names参数,但这个参数主要管表名、库名的大小写,对BLOB内容的比较作用不大,还可能影响其他业务,所以不建议这么做。
内容的提问来源于stack exchange,提问作者user3523426
相关产品推荐
相关产品推荐

