还有一些问题:
我不在乎这里的区分大小写
>如果我有一个char(例如),并且他被存储在nvarchar中 – 它可以容纳任何东西,为什么我需要在这里整理?
>如果我是“FaceBook”,我需要存储所有语言的所有字符,排序规则和我的nvarchar列之间的关系是什么?
提前致谢.
解决方法
存储在sql Server中的XML和N前缀类型中的Unicode数据可以使用单个字符集来表示所有语言(大部分,也就是其目标)的所有字符.因此,对于XML / NCHAR / NVARCHAR数据(我将不再使用NTEXT,因此不再使用),Collations不会更改可以存储的字符.对于CHAR和VARCHAR数据,排序确实会影响每个排序规则指向特定代码页可以存储的内容,从而确定了可以存储在值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”.但是,“å”不等于只有一个“a”:
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归类(归类不是取决于您使用的操作系统和安装的.NET Framework的版本(请参阅SortVersion的详细信息),基于Unicode 5.0或6.0.
这就是Collations做的.如果您想查看所有可用的排序规则,只需运行以下命令:
SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];