SQL Server Collat​​ion / ADO.NET DataTable.Locale使用不同的语言

时间:2010-04-26 14:37:10

标签: sql-server ado.net locale collation

我们有WinForms应用程序,它通过ADO.NET(1.1,正在移植到4.0)在SQL Server(2000,我们正在努力在2008年移植它)中存储数据。如果我阅读预先用西欧语言环境编写的数据(例如:“test”,“testù”),一切正常,但现在我们必须能够混合西方和非西方的字母表(例如:“test - ۓےۑ“ - 这些只是随机的阿拉伯字符。”

在SQL Server端,已使用Latin1_General排序规则设置数据库,该字段为nvarchar(80)。如果我运行SQL SELECT语句(例如:“SELECT * FROM MyTable WHERE field = 'test - ۓےۑ'”,不介意查询分析器中的“*”或实际名称),我得不到任何结果;如果我将Sql语句传递给ADO.NET DataAdapter来填充DataTable,也会发生同样的情况。我的猜测是它与排序有关,但我不知道如何纠正这个问题:我是否必须更改为排序规则(SQL Server)到另一个排序规则?或者我是否必须在DataAdaoter / DataTable(ADO.NET)上设置区域设置?

提前致谢任何有帮助的人

2 个答案:

答案 0 :(得分:3)

在将nvarchar与扩展字符进行比较时,不应该使用 N 。设置?

SELECT * From TestTable WHERE GreekColCaseInsensitive = N'test - ۓےۑ'

答案 1 :(得分:1)

是的,问题很可能是整理。 Latin1_General排序规则不包括排序和比较非拉丁字符的规则。

MSDN声称:

  

如果必须存储反映多种语言的字符数据,则可以通过始终使用Unicode nchar,nvarchar和ntext数据类型而不是char,varchar,text数据类型来最小化排序规则兼容性问题。使用Unicode数据类型可以消除代码页转换问题。

由于您已遵守此规定,因此您应进一步了解有关混合整理环境here的信息。

此外,我想补充一点,只是更改排序规则并不容易,请查看MSDN for SQL 2000:

  

设置SQL Server 2000时,使用正确的排序规则设置非常重要。您可以在运行安装程序后更改排序规则设置,但必须重建数据库并重新加载数据。建议您在组织内为这些选项制定标准。如果整理服务器在服务器之间不一致,则许多服务器到服务器活动可能会失败。

您可以在每个列的基础上指定排序规则:

CREATE TABLE TestTable (
   id int,  
   GreekColCaseInsensitive nvarchar(10) collate greek_ci_as,
   LatinColCaseSensitive nvarchar(10) collate latin1_general_cs_as
   )

查看不同的二进制多语言归类here。根据您使用的字符集,您应该找到适合您目的的字符集。

如果您无法或不愿意更改列的排序规则,您还可以指定要在查询中使用的排序规则,如:

SELECT * From TestTable 
WHERE GreekColCaseInsensitive = N'test - ۓےۑ'
COLLATE latin1_general_cs_as

由于 jfrobishow 指出在您要用于比较的字符串前面使用 N 是必不可少的。它做了什么:

  

它表示后续字符串是Unicode(N实际上代表国家语言字符集)。这意味着您传递的是NCHAR,NVARCHAR或NTEXT值,而不是CHAR,VARCHAR或TEXT。有关这些数据类型的比较,请参阅文章#2354。

您可以快速找到here