如何在SQL SERVER 2008中使用ORDER BY,LOWER和非unicode数据

时间:2010-03-30 05:39:48

标签: sql-server non-unicode

问题是亚美尼亚语。我正在使用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. ԹԶէըԿր - > թզէըկր

2 个答案:

答案 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存储数据,您有几个选择:

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