如何通过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
相关产品推荐
相关产品推荐

