代码之家  ›  专栏  ›  技术社区  ›  hgulyan

如何在SQL Server 2008中对非Unicode数据使用Order By,Lower

  •  3
  • hgulyan  · 技术社区  · 14 年前

    问题是关于亚美尼亚人。我正在使用SQL Server 2005,排序规则 SQL拉丁语通用语,数据主要是亚美尼亚语,我们不能使用Unicode。

    我在ms sql 2008上测试了亚美尼亚语的windows排序规则(cyrillic_general_100_u),我在这里找到了,( http://msdn.microsoft.com/en-us/library/ms188046.aspx )但没用。

    我有一个函数,它对十六进制值进行排序,还有一个较低的函数,它接受每个字符串中的每个字符并将其转换为较低的形式,但这是不可接受的解决方案,它的工作非常缓慢,在一个大表的每一列上都调用该函数。

    有没有解决这个问题的办法不使用Unicode并且不手动使用十六进制值?

    更新:

    左边是混合大小写单词,按右边的顺序排序,右边是小写表示。希望这会有帮助。谢谢您。 单词是用Unicode编写的。

    1. “->”

    2. “停止工作”

    3. ·gt;·gt;

    4. 我是说

    5. -gt;

    6. -gt;

    7. _______

    8. ?—>?”

    9. _

    10. §第->§条

    2 回复  |  直到 12 年前
        1
  •  3
  •   Thomas    14 年前

    一种解决方案是为每个文本列创建一个计算列,该列将值转换为亚美尼亚排序规则并将其设置为小写,如下所示:

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

    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,我不确定它的性能如何。

    现在,也就是说,我已经能够让您在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)
    

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

        2
  •  0
  •   Peter Radocchia    14 年前

    你犯了这样的错误吗?

    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_%'
    
    推荐文章