带有“åäö”的 Linq 查询返回表中的所有项目
Posted
技术标签:
【中文标题】带有“åäö”的 Linq 查询返回表中的所有项目【英文标题】:Linq query with 'åäö' returns all items in table 【发布时间】:2020-05-22 15:06:10 【问题描述】:我的网站上有一个基本的搜索功能。一切正常,除了当用户只搜索这三个“åäö”中的一个字符时,查询会返回表中的所有项目。怎么会这样?字符是否在 t-sql 中转换为其他内容?
Dim sanitizedstring As String = helpclass.RemoveInvalidFileNameChars(txtSearch.Text, True)
Dim getArtists = From s In dc.tbl_artists _
Where s.ArtistName.ToString.ToLower.Contains(sanitizedstring) _
Select s
编辑:
数据库的排序规则是Latin1_General_CI_AI.
【问题讨论】:
它可能与您的数据库 collation 相关(因此实际上与 C# 代码甚至 TSQL 无关)。它是哪一个? (如果检查数据库/数据库服务器的属性)sanitizedstring
包含什么?它包含任何东西吗?如果RemoveInvalidFileNameChars
删除所有非英文字符,它将是一个空字符串,表达式ArtistName.Contains("")
将生成匹配所有非空值的ArtistName LIKE '%%'
条件
在该排序规则中,å
、ä
和 ö
等于 a
和 o
。这就是AI
的意思,不区分口音。同样,查询不会返回所有行,它只会返回那些包含匹配子字符串的行
"Now i just gotta figure how to change collation to one that supports å ä ö then."
← 在扣动扳机之前,请三思而后行。如果您有一个名为City
的列并且您存储了值Øslo
(芬兰),那么无论哪种情况,它都会返回给用户。如果用户决定搜索该名称并输入 Oslo
或 Øslo
作为查询过滤器值,那么 AI 排序规则版本将返回结果值 Øslo
但是如果您在Øslo
with 上查询,非 AI 排序规则将仅返回结果。这可能会导致您的用户出现意外的系统行为。
^-- (续) - 这也可能影响列上的任何唯一性约束/索引。在没有 AI 排序规则的列上强制唯一约束将允许值Øslo
和 Oslo
存在于同一列中,因为它们现在是2 个唯一值。 with 列 AI 会将其视为违反唯一性约束。
【参考方案1】:
这种明显忽略某些字符的行为可能是由于排序规则。
由于您的排序规则是重音不敏感 (AI),DB 将认为åäö
与文本查询中的aao
相同。
这可能是问题的根源,(请注意,在不知道您的数据是什么的情况下,我们无法确定诊断结果)
解决办法:
将数据库的排序规则更改为区分重音 (AS)。
例如,Latin1_General_CI_AS
可能是明智的第一个测试。
更多信息
SQLServer collation documentation 获取排序规则列表和更多信息
This interesting and detailed answer on a related Stack Overflow question
请记住,为了可用性,不区分重音是一种不错的默认行为。以 cmets 为例:您希望您的用户在输入 Oslo 时找到城市 Øslo 吗?如果您有唯一约束(在这种情况下它们将被视为相同的键),它也会产生影响
【讨论】:
【参考方案2】:根据RemoveInvalidFileNameChars
,这些字符是否被认为对文件名有效?
如果不是,RemoveInvalidFileNameChars
可能返回一个空字符串,Contains
对于空字符串始终为真。
【讨论】:
函数返回 åäö 就好了,不幸的是没有问题。以上是关于带有“åäö”的 Linq 查询返回表中的所有项目的主要内容,如果未能解决你的问题,请参考以下文章
带有 åäö(特殊字符)的 Alamofire GET 请求,无效 url