一种解决方案是为每个文本列创建一个计算列,该列将值转换为亚美尼亚排序规则并将其设置为小写,如下所示:
Alter Table TableName
Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED
完成此操作后,可以在这些列上放置索引并查询它们。
如果这不是您喜欢的tea,那么另一个解决方案是索引视图,您可以在其中创建一个视图
SCHEMABINDING
将各个列强制转换为小写和右排序规则,然后在该视图上放置索引。
编辑
我注意到在你的例子中,你使用的是不区分大小写、区分重音的。也许解决订购问题的简单方法是使用Latin1_General_cs_as或Cyrillic_General_100_cs_as(如果可用)。
编辑
唷!经过相当多的研究,我想我有一个答案,不幸的是,可能不是你想要的。首先,是的,我可以将您提供的文本复制到代码或记事本++之类的东西中,因为stackoverflow是使用utf-8编码的,亚美尼亚语将适合utf-8。其次,这暗示了您要实现的目标:将utf-8存储在sql server中。不幸的是,sql server 2008(或任何以前的版本)本机不支持utf-8。为了在utf-8中存储数据,您有几个选择:
-
将其存储在二进制文件中,并在客户端将其转换为utf-8(这几乎消除了在服务器上进行的任何排序)
-
将其存储在unicode中,并在客户端将其转换为utf-8。应该注意的是,sql server驱动程序已经将大多数字符串转换为unicode,并且您的示例在unicode中工作得很好。明显的缺点是它占用了两倍的空间。
-
在SQL Server中创建CLR用户定义类型以存储UTF-8值。Microsoft提供了一个与SQL Server一起提供的示例来执行此操作。你可以从
CodePlex from here
. 您还可以在本文的
Books Online
. 缺点是必须在sql server中启用clr,我不确定它的性能如何。
现在,也就是说,我已经能够让您在sql server中使用unicode没有问题地工作了。
If object_id('tempdb..#Test') Is Not Null
Drop Table #Test
GO
Create Table #Test
(
EntrySort int identity(1,1) not null
, ProperSort int
, MixedCase nvarchar(50)
, Lowercase nvarchar(50)
)
GO
Insert #Test(ProperSort, MixedCase, Lowercase)
Select 1, N'Ô±Õ¢Ô³Õ¤ÔµÕ¦',N'Õ¡Õ¢Õ£Õ¤Õ¥Õ¦'
Union All Select 6, N'ÔµÕ¬Ô²Õ¶ÕÕ¶',N'Õ¥Õ¬Õ¢Õ¶Õ¶Õ¶'
Union All Select 2, N'Ô±Õ£Ô³Õ½Ô´Ô¼',N'Õ¡Õ£Õ£Õ½Õ¤Õ¬'
Union All Select 3, N'Ô²Õ¡Ô´ÖÕ¤Ô´',N'Õ¢Õ¡Õ¤ÖÕ¤Õ¤'
Union All Select 4, N'Ô³Ô³Ô¼Õ¡Õ½Õ¡',N'Õ£Õ£Õ¬Õ¡Õ½Õ¡'
Union All Select 5, N'Ô´Õ´Õ´Õ¬Ö
Õ',N'Õ¤Õ´Õ´Õ¬Ö
Õ¿'
Union All Select 9, N'Ô¸ÕÔ¾Õ¤Õ½Õ',N'Õ¨ÕÕ®Õ¤Õ½Õ²'
Union All Select 7, N'Ô¶ÕÕ¬Õ¸ÖÕ¿',N'Õ¦Õ¾Õ¬Õ¸ÖÕ¿'
Union All Select 10, N'Ô¹Ô¶Õ§Õ¨Ô¿Ö',N'Õ©Õ¦Õ§Õ¨Õ¯Ö'
Union All Select 8,N'Õ§Ô¹ÖÕ±Õ»Õ',N'Õ§Õ©ÖÕ±Õ»Ö'
Select * From #Test Order by ProperSort
Select * From #Test Order by Lowercase
Select * From #Test Order by Lower(MixedCase)
所有这三个查询都返回相同的结果。