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

SQLite下SQLAlchemy LIKE筛选需改为区分大小写的技术求助

解决SQLAlchemy操作SQLite时LIKE区分大小写的问题

嘿,我之前也碰到过SQLite + SQLAlchemy里LIKE不区分大小写的问题,刚好能帮到你!SQLite 默认的 LIKE 操作之所以不区分大小写,是因为它的字符串列默认使用了 NOCASE 排序规则。要改成区分大小写的匹配,有两种简单直接的方法:

方法一:使用 COLLATE BINARY 强制区分大小写

这是最贴近你原有代码逻辑的方案,只需要在 current_value 字段后加上 collate('BINARY'),就能让 LIKE 匹配按照二进制编码区分大小写。

修改后的完整查询代码:

self.session.query(Value.scan).filter(
    Value.current_value.collate('BINARY').like(f"%{search}%"),
    Value.tag == Tag.tag,
    Tag.visible == True
).distinct().all()

这个方法不需要改变你的通配符使用习惯(依然用 %),非常省心。

方法二:用 SQLite 原生的 GLOB 操作符替代 LIKE

SQLite 的 GLOB 操作符天生就是区分大小写的,不过它的通配符规则和 LIKE 不一样:用 * 代替 % 表示任意字符,用 ? 代替 _ 表示单个字符。如果你的快速搜索逻辑就是“包含匹配”,直接把搜索模式改成 *{search}* 就行。

修改后的代码示例:

# 构建GLOB的匹配模式,这里直接用*做通配符实现包含搜索
glob_pattern = f"*{search}*"
self.session.query(Value.scan).filter(
    Value.current_value.op('GLOB')(glob_pattern),
    Value.tag == Tag.tag,
    Tag.visible == True
).distinct().all()

注意:如果你的搜索输入里可能包含 * 或 ? 这类特殊字符,需要额外做转义处理,不过快速搜索栏的输入一般不会有这些,所以这个方案也很实用。

内容的提问来源于stack exchange,提问作者Lucie ouvrier-buffet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:02