3

问题是关于亚美尼亚语的。我正在使用 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 写的。

  1. ԱբԳդԵզ -> աբգդեզ

  2. ԱգԳսԴԼ -> ագգսդլ

  3. ԲաԴֆդԴ -> բադֆդդ

  4. ԳԳԼասա -> գգլասա

  5. ԴմմլօՏ -> դմմլօտ

  6. ԵլԲնՆն -> ելբննն

  7. ԶՎլուտ -> զվլուտ

  8. էԹփձջՐ -> էթփձջր

  9. ԸխԾդսՂ -> ըխծդսղ

  10. ԹԶէըԿր -> թզէըկր

4

2 回答 2

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。其次,这暗示了您要实现的目标:将 UTF-8 存储在 SQL Server 中。不幸的是,SQL Server 2008(或任何以前的版本)本身并不支持 UTF-8。为了以 UTF-8 存储数据,您有以下几种选择:

  1. 将其存储为二进制并在客户端将其转换为 UTF-8(这几乎消除了在服务器上进行的任何排序)
  2. 将其存储为 Unicode 并在客户端将其转换为 UTF-8。应该注意的是,SQL Server 驱动程序已经将大多数字符串转换为 Unicode,并且您的示例在 Unicode 中可以正常工作。明显的缺点是它占用了两倍的空间。
  3. 在 SQL Server 中创建 CLR 用户定义类型以存储 UTF-8 值。Microsoft 提供了 SQL Server 附带的示例来执行此操作。您可以从此处从 CodePlex下载示例。您还可以在联机丛书中的本文中找到有关示例的更多信息。缺点是您必须在 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)

所有这三个查询都返回相同的结果。

于 2010-03-30T05:58:39.437 回答
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_%'
于 2010-03-30T06:14:22.813 回答