You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同字符集排序规则下,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:13:09