Sql server 使用'åäö';返回表中的所有项
我在我的网站上有一个基本的搜索功能。除了当用户只搜索这三个“åäö”中的一个字符,然后查询返回表中的所有项目外,其他一切都很好。这怎么可能?字符是否在t-sql中转换为其他字符Sql server 使用'åäö';返回表中的所有项,sql-server,vb.net,linq,tsql,collation,Sql Server,Vb.net,Linq,Tsql,Collation,我在我的网站上有一个基本的搜索功能。除了当用户只搜索这三个“åäö”中的一个字符,然后查询返回表中的所有项目外,其他一切都很好。这怎么可能?字符是否在t-sql中转换为其他字符 Dim sanitizedstring As String = helpclass.RemoveInvalidFileNameChars(txtSearch.Text, True) Dim getArtists = From s In dc.tbl_artists _ Where s.
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
编辑:
数据库的排序规则是拉丁文1\u General\u CI\u AI。这种明显忽略某些字符的行为可能是由于排序规则造成的 由于排序规则不区分重音(AI),
åäö
将被DB视为与文本查询的aao
相同
这可能是问题的根源(请注意,在不知道您的数据是什么的情况下,我们无法确定诊断结果)
解决方案:
将数据库的排序规则更改为重音敏感(AS)
例如,Latin1\u General\u CI\u AS
可能是明智的第一个测试
更多信息
- 查看排序规则列表和更多信息
- 请记住,对于可用性来说,不区分重音是一种不错的默认行为。以评论为例:您是否希望您的用户在键入奥斯陆时找到城市Øslo?。如果您有唯一的约束,它也会产生影响(在此上下文中,它们将被视为同一个键)
RemoveInvalidFileNameChars
,这些字符中是否有一个被认为对文件名有效
否则,
RemoveInvalidFileNameChars
可能返回一个空字符串,Contains
对于空字符串总是正确的。它可能与您的数据库排序规则有关(因此实际上与C#code甚至TSQL无关)。是哪一个?(如果检查数据库/数据库服务器的属性,sanitizedstring
包含什么?里面有什么东西吗?如果RemoveInvalidFileNameChars
删除所有非英文字符,则它将是一个空字符串,表达式ArtistName.Contains(“”
将生成ArtistName,如“%”
条件,该条件匹配该排序规则中的所有非空值,ä
和ö
等于a
和o
。这就是AI
的意思,不区分重音。同样,查询不会返回所有行,它只会返回那些包含匹配子字符串的行。“现在我只想知道如何将排序规则更改为支持åäöthen的排序规则。”← 在你扣动扳机之前仔细想想。如果您有一个名为City
的列,并且您存储了Øslo
(芬兰)的值,则无论哪种情况,都会将该值返回给用户。如果用户决定搜索该名称并键入Oslo
或Øslo
作为查询筛选值,AI排序规则版本将返回结果值Øslo
,但非AI排序规则仅在带重音的Øslo
查询时返回结果。这可能会导致用户出现意外的系统行为。^(续)-这也可能会影响列上的任何唯一性约束/索引。在没有AI排序的列上强制使用唯一约束将允许值Øslo
和Oslo
与现在的2个唯一值存在于同一列中。带有AI的列会认为这违反了唯一性约束。函数返回的åäö很好,不幸不是问题所在。