none
SQL Server COLLATE 子句的问题 RRS feed

  • 问题

  • 平台:Microsoft SQL Server 2008 R2 中文版

    测试SQL:

    IF OBJECT_ID('tc2') IS NOT NULL

        DROP TABLE tc2

    GO

    --数据库默认排序规则是Chinese_PRC_CI_AS

    --即不区分大小写,区分重音

    CREATE TABLE tc2

    (

        code VARCHAR(20)

    )

    GO

     

    INSERT INTO tc2 VALUES

    ('ba'),

    ('BA'),

    ('bb'),

    ('bA'),

    ('Ba'),

    ('ab'),

    ('AB'),

    ('aa'),

    ('aB'),

    ('Ab')

    GO

     

    SELECT * FROM dbo.tc2  ORDER BY code COLLATE Chinese_PRC_CS_AS

    GO

     结果如下:

    code
    aa
    ab
    aB
    Ab
    AB
    ba
    bA
    Ba
    BA
    bb

    疑问:这个排序规则究竟是怎么工作的?为什么bb在BA后面?

     

    2010年9月16日 5:55

答案

  • 多加入几个例子后,顺序如下:aa
    ab
    aB
    Ab
    AB
    ba
    bA
    Ba
    BA
    bb
    bB
    Bb
    BB
    bC
    Bc

    解释是这样的:

    首先按字符实际含义排序,因此所有bb(或者bB,Bb,BB)在ba(或者BA,Ba,bA)后面.

    然后实际含义相同的字符串,大写排在小写后,按字符位置从先到后排序,即ba->bA->Ba-BA. <lowercase letters sort ahead of their uppercase versions>


    Mark as Answer if it helps. This posting is provided "AS IS" with no warranties, confers no rights.
    • 已标记为答案 凤凰竹 2010年9月16日 7:56
    2010年9月16日 7:32

全部回复


  • IF OBJECT_ID('tc1') IS NOT NULL
        DROP TABLE tc1
    GO

    --数据库默认排序规则是Chinese_PRC_CI_AS
    --不区分大小写,区分重音

    CREATE TABLE tc1
    (
        code NCHAR(2),
        icode NCHAR(2)
    )
    GO

    INSERT INTO tc1 VALUES
    ('a1', 'ab'),
    ('A2', 'AB'),
    ('a3', 'aa'),
    ('A4', 'aB'),
    ('A5', 'Ab'),
    ('b1', 'ba'),
    ('B2', 'BA'),
    ('b3', 'bb'),
    ('B4', 'bA'),
    ('B5', 'Ba')
    GO

    SELECT * FROM dbo.tc1  ORDER BY code COLLATE Chinese_PRC_CS_AS
    SELECT * FROM dbo.tc1  ORDER BY code COLLATE Chinese_PRC_CI_AS

    SELECT * FROM dbo.tc1  ORDER BY icode COLLATE Chinese_PRC_CS_AS
    SELECT * FROM dbo.tc1  ORDER BY icode COLLATE Chinese_PRC_CI_AS
    GO

    这个测试中,order by code, Chinese_PRC_CS_AS还是 Chinese_PRC_CI_AS根本不起作用,而后面的order by icode,则起作用,但结果依然令人不解

    2010年9月16日 6:01
  • 多加入几个例子后,顺序如下:aa
    ab
    aB
    Ab
    AB
    ba
    bA
    Ba
    BA
    bb
    bB
    Bb
    BB
    bC
    Bc

    解释是这样的:

    首先按字符实际含义排序,因此所有bb(或者bB,Bb,BB)在ba(或者BA,Ba,bA)后面.

    然后实际含义相同的字符串,大写排在小写后,按字符位置从先到后排序,即ba->bA->Ba-BA. <lowercase letters sort ahead of their uppercase versions>


    Mark as Answer if it helps. This posting is provided "AS IS" with no warranties, confers no rights.
    • 已标记为答案 凤凰竹 2010年9月16日 7:56
    2010年9月16日 7:32
  • 谢谢,这个解释符合测试结果

    2010年9月16日 7:58