带有“åäö”的 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.

【问题讨论】:

它可能与您的数据库 collat​​ion 相关(因此实际上与 C# 代码甚至 TSQL 无关)。它是哪一个? (如果检查数据库/数据库服务器的属性) sanitizedstring 包含什么?它包含任何东西吗?如果RemoveInvalidFileNameChars 删除所有非英文字符,它将是一个空字符串,表达式ArtistName.Contains("") 将生成匹配所有非空值的ArtistName LIKE '%%' 条件 在该排序规则中,åäö 等于 ao。这就是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

MySQL 将 ÅÄÖ 视为 AAO?

(问号) 而不是旧页面上的ÅÄÖ

MacOS wc(wordcount)计算带有UTF-8字符Å的错误单词

ÅÄÖ:啥被认为是对 SEO 更友好的 URL

ASP.Net mvc5 我的网站不允许'åäö'