问题是亚美尼亚语。我正在使用sql server 2005,整理 SQL_Latin1_General_CP1_CI_AS,数据主要是亚美尼亚语,我们不能使用unicode。
我在ms sql 2008上测试了一个用于亚美尼亚语言(Cyrillic_General_100_)的Windows排序规则,我在这里找到了,(http://msdn.microsoft.com/en-us/library/ms188046.aspx),但它没有帮助。
我有一个函数,它命令十六进制值和一个较低的函数,它接受每个字符串中的每个字符并将其转换为它的低级形式,但这是不可接受的解决方案,它工作得非常慢,在每一列上调用该函数一张巨大的桌子。
对于此问题,是否有任何解决方案不使用unicode而不是手动使用十六进制值?
更新:
左侧是混合大小写单词,按正确的顺序排序,右侧是小写表示。希望这会有所帮助。谢谢。 单词是用unicode编写的。
ԱբԳդԵզ - > աբգդեզ
ԱգԳսԴԼ - > ագգսդլ
ԲաԴֆդԴ - > բադֆդդ
ԳԳԼասա - > գգլասա
ԴմմլօՏ - > դմմլօտ
ԵլԲնՆն - > ելբննն
ԶՎլուտ - > զվլուտ
էԹփձջՐ - > էթփձջր
ԸխԾդսՂ - > ըխծդսղ
ԹԶէըԿր - > թզէըկր
答案 0 :(得分:3)
一种解决方案是为每个文本列创建一个计算列,将该值转换为亚美尼亚排序规则并将其设置为小写,如下所示:
Alter Table TableName
Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED
执行此操作后,您可以在这些列上放置索引并查询它们。
如果这不是你的茶的味道,那么另一个解决方案将是一个索引视图,您可以在其中创建一个SCHEMABINDING
视图,将每个列转换为小写和右侧整理,然后放入该视图的索引。
编辑我在您的示例中注意到您使用的是区分大小写,重音敏感的。也许对您的订购问题的简单解决方案是使用Latin1_General_CS_AS或Cyrillic_General_100_CS_AS(如果可用)。
修改强>
呼。经过相当多的研究,我想我有一个答案,遗憾的是可能不是你想要的。首先,是的,我可以将您提供的文本复制到代码或类似Notepad ++的内容,因为StackOverflow使用UTF-8进行编码,而亚美尼亚语则适合UTF-8。其次,这暗示了您要实现的目标:在SQL Server中存储UTF-8。不幸的是,SQL Server 2008(或任何以前的版本)本身不支持UTF-8。为了以UTF-8存储数据,您有几个选择:
现在,就是说,我能够让您在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)
所有这三个查询都会返回相同的结果。
答案 1 :(得分:0)
你有这样的错误吗?
Msg 448, Level 16, State 1, Line 1
Invalid collation 'Cyrillic_General_100_'.
尝试:
ORDER BY Name COLLATE Cyrillic_General_100_CI_AS
或者从此列表中选择您喜欢的一个:
select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'