使用“åäö”的 Linq 查询 returns table 中的所有项目
Linq query with 'åäö' returns all items in table
我的网站上有基本的搜索功能。除了当用户仅搜索这三个 'åäö' 中的一个字符然后查询 returns table 中的所有项目时,一切都运行良好。怎么会这样?字符是否转换为 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.
这种明显忽略某些字符的行为可能是由于整理。
由于您的排序规则是重音 不敏感 (AI),åäö
将被数据库视为与文本查询的 aao
相同。
这可能是问题的根源,(请注意,在不知道您的数据是什么的情况下,我们无法确定诊断结果)
解决方案:
将数据库的排序规则更改为区分重音 (AS)。
例如,Latin1_General_CI_AS
可能是一个明智的第一次测试。
更多信息
SQLServer collation documentation 获取排序规则列表和更多信息
This interesting and detailed answer on a related Stack Overflow question
请记住,对于可用性而言,不区分重音是一种不错的默认行为。从评论中举个例子:你想让你的用户在输入 Oslo 时找到城市 Øslo 吗?。如果您有唯一约束(在这种情况下它们将被视为相同的键),它也会产生影响
根据 RemoveInvalidFileNameChars
,这些字符中的任何字符是否被认为对文件名有效?
如果不是,RemoveInvalidFileNameChars
可能返回一个空字符串,而 Contains
对于空字符串总是正确的。
我的网站上有基本的搜索功能。除了当用户仅搜索这三个 'åäö' 中的一个字符然后查询 returns table 中的所有项目时,一切都运行良好。怎么会这样?字符是否转换为 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.
这种明显忽略某些字符的行为可能是由于整理。
由于您的排序规则是重音 不敏感 (AI),åäö
将被数据库视为与文本查询的 aao
相同。
这可能是问题的根源,(请注意,在不知道您的数据是什么的情况下,我们无法确定诊断结果)
解决方案:
将数据库的排序规则更改为区分重音 (AS)。
例如,Latin1_General_CI_AS
可能是一个明智的第一次测试。
更多信息
SQLServer collation documentation 获取排序规则列表和更多信息
This interesting and detailed answer on a related Stack Overflow question
请记住,对于可用性而言,不区分重音是一种不错的默认行为。从评论中举个例子:你想让你的用户在输入 Oslo 时找到城市 Øslo 吗?。如果您有唯一约束(在这种情况下它们将被视为相同的键),它也会产生影响
根据 RemoveInvalidFileNameChars
,这些字符中的任何字符是否被认为对文件名有效?
如果不是,RemoveInvalidFileNameChars
可能返回一个空字符串,而 Contains
对于空字符串总是正确的。