2012-03-18 31 views
10

四,阅读了很多关于这一点。nvarchar(Unicode)列的COLLATIONS的要点是什么?

还有一些问题:

我不是在谈论这里的情况下...敏感

  • 如果我有一个char(ש例如),他被保存在nvarchar - 可容纳任何东西,为什么在这里需要collation

  • 如果我是“脸谱”,我需要存储all字符从all语言的能力,什么是整理和我nvarchar列之间的关系?

在此先感谢。

+5

排序规则不会[直接]说出可以存储的内容。整理确定排序和平等。例如,一些归类不区分大小写或不区分变音,而其他归类不区分。 – 2012-03-18 07:41:30

+0

@pst如果我存储'ש'并且我'按'排序,所以他应该通过包含'ש'的字符来排序。 .....不是? – 2012-03-18 07:44:28

+0

@ user166390“排序规则不会[直接]说出可以存储的内容。”并不完全正确。这只适用于'NVARCHAR' /'NCHAR'字段。对于'VARCHAR'和'CHAR'字段,归类确实确定了可以存储在那里的内容,因为它包含确定代码页的LCID。 – 2015-09-30 17:42:30

回答

8

存储并表示字符是一回事,知道如何排序和比较他们是另一回事。

Unicode数据,存储在XMLN -prefixed类型在SQL Server中,可以代表所有语言的所有字符(在大多数情况下,这是它的目标),以单字节字符集。因此,对于XML/NCHAR/NVARCHAR数据(我将不再使用NTEXT),Collat​​ions不会更改可以存储哪些字符。对于CHARVARCHAR数据的排序规则影响什么可以存储为每个比指向一个特定的代码页,它决定什么可以128存储在价值观 - 255

现在,虽然有一个默认的排序为所有角色订购,不可能适用于所有语言和文化。有许多语言共享一些/许多/所有字符,但对于如何对它们进行排序有不同的规则。例如,字母“C”出现在使用这些字母的大多数字母中的字母“D”之前。在美国英语中,“C”和“H”(即“CH”作为两个单独的字母)的组合自然会出现在以“D”开始的任何字符串之前。但是,在一些语言中,“CH”的两个字母的组合是特殊的,之后“d”排序

IF ( N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI 
    AND N'C' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI 
    AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI 
    ) PRINT 'Czech_CI_AI'; 

IF ( N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI 
    AND N'C' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI 
    AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI 
    ) PRINT 'Czech_100_CI_AI'; 

IF ( N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI 
    AND N'C' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI 
    AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI 
    ) PRINT 'Slovak_CI_AI'; 

IF ( N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS 
    AND N'C' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS 
    AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS 
    ) PRINT 'Slovak_CS_AS'; 

IF ( N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS 
    AND N'C' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS 
    AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS 
    ) PRINT 'Latin1_General_100_CI_AS' 
ELSE PRINT 'Nope!'; 

返回:

Czech_CI_AI 
Czech_100_CI_AI 
Slovak_CI_AI 
Slovak_CS_AS 
Nope! 

如果想查看排序规则的例子各种文化,请参阅:Collation Charts

此外,在某些语言中,某些字母或字母组合等同于其他字母,但它们在大多数其他语言中并不存在。例如,只有在丹麦语中,“å”等同于“aa”。但是,“一”并不等同于只是一个单一的“一”:

IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI 
AND N'a' COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI 
    ) PRINT 'Danish_Greenlandic_100_CI_AI'; 

IF ( N'aa' COLLATE Danish_Norwegian_CI_AI = N'å' COLLATE Danish_Norwegian_CI_AI 
    AND N'a' COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI 
    ) PRINT 'Danish_Norwegian_CI_AI'; 

IF ( N'aa' COLLATE Latin1_General_100_CI_AI = N'å' COLLATE Latin1_General_100_CI_AI 
    AND N'a' COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI 
    ) PRINT 'Latin1_General_100_CI_AI' 
ELSE PRINT 'Nope!'; 

返回:

Danish_Greenlandic_100_CI_AI 
Danish_Norwegian_CI_AI 
Nope! 

这都是非常复杂的,而且我还没有提到处理的右(希伯来文和阿拉伯文),中文,日文,组合字符等。

如果您想深入了解规则,请查看Unicode Collation Algorithm (UCA)。上述示例基于该文档中的示例,尽管我不相信UCA中的所有规则都已实施,尤其是因为Windows归类(归类而非SQL_开头)基于Unicode 5.0或6.0,具体取决于您正在使用的操作系统以及安装的.NET Framework版本(有关详细信息,请参阅SortVersion)。

这就是Collat​​ions所做的事情。如果要查看所有可用的排序规则,请执行以下操作:

SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name]; 
6

如果你有一个字符,那么就没有秩序。但是,如果您命令以人名命名 - 根据排序规则,不同语言中的不同特殊字符的排序方式会有所不同。

第一核对可以是大小写敏感的 - B之前显示的所有B - 和第二特殊字符具有取决于排序的特殊规则。

的文档上很不错。

+0

SQL如何将英语,阿拉伯语,希伯来语排列在一起?没有共同的逻辑......?请解释一下 – 2012-03-18 09:56:11

+0

你可以,如果你是无知的。并且使用例如英语堡垒命令到处。 Saldly这不一定是正确的。 http://www.sqlservercentral.com/blogs/rocks/2012/01/09/revised-difference-between-collat​​ion-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as/有一个例子(西班牙语)。你认为MS是白痴吗? http://msdn.microsoft.com/en-us/library/ms144250.aspx具有所有的排序规则,并且它们中的很多都是特定于语言的语言。你认为他们没有理由这样做?不,在特定顺序中,特殊字符的位置依赖于语言。 – TomTom 2012-03-18 11:49:50

6

我认为楼主是越来越代码页和归类之间的混淆。

nvarchar/nchar中的“n”允许您使用unicode编号集来存储文本,该编码集的大小足以包含所有语言的所有字符(原则上无论如何)都包含唯一编号。这本身与排序规则无关。 nvarchar/nchar不使用CODE PAGES来编码/解码每个字符代码的含义。

排序规则定义字符和哪个字符变体的排列顺序应被视为是相同的。 nvarchar/nchar是否使用COLLATIONS来定义这些区别。