【发布时间】: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但是如果您在Øslowith 上查询,非 AI 排序规则将仅返回结果。这可能会导致您的用户出现意外的系统行为。 -
^-- (续) - 这也可能影响列上的任何唯一性约束/索引。在没有 AI 排序规则的列上强制唯一约束将允许值
Øslo和Oslo存在于同一列中,因为它们现在是2 个唯一值。 with 列 AI 会将其视为违反唯一性约束。
标签: sql-server vb.net linq tsql collation