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

如何通过Entity Framework Core实现带emoji的文本模糊搜索

问题根因

你遇到的返回全表数据的问题,核心是数据库默认排序规则(Collation)对emoji这类Unicode代理对字符的匹配逻辑异常。默认排序规则下,emoji字符的匹配权重被判定为与空字符串等价,导致CHARINDEX的判断恒为真,最终返回所有记录;Equals可以正常运行是因为等值匹配的逻辑和子串匹配的collation处理逻辑不同。


解决方案

方案1:EF Core原生实现(推荐)

EF Core 5.0及以上版本支持通过EF.Functions.Collate方法临时指定查询使用的排序规则,选择*二进制排序规则(如Latin1_General_BIN2)*即可实现逐字节精确匹配,避免emoji匹配异常:

var emoji = "⭐";
var query = myContext.Products
    .Where(x => EF.Functions.Collate(x.Name, "Latin1_General_BIN2").Contains(emoji));

var list = query.ToList();

方案2:原生SQL实现

如果需要直接使用原生SQL查询,可以在查询时手动为字段指定排序规则:

var emoji = "⭐";
var list = myContext.Products
    .FromSqlInterpolated($@"
        SELECT [p].[Id], [p].[Name], [p].[Quantity] 
        FROM [Products] AS [p]
        WHERE CHARINDEX({emoji}, [p].[Name] COLLATE Latin1_General_BIN2) > 0
    ")
    .ToList();

优化建议

如果业务场景频繁需要对字段做emoji、特殊字符匹配,可以直接修改表中对应字段的默认排序规则为Latin1_General_100_CI_AS_SC_UTF8或者Latin1_General_BIN2,不需要每次查询额外指定排序规则,查询性能更好。

内容的提问来源于stack exchange,提问作者qweuser22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:15:03