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

SQL Server 2008-varchar值与nvarchar值的排序顺序不同

  •  2
  • DanP  · 技术社区  · 14 年前

    在SQL Server 2008中,我在订购nvarchar列时看到了一些奇怪的行为;下面是一些要演示的快速用例:

    案例1:varchar值的顺序:

    SELECT t.Name
    FROM
    ( 
    SELECT CAST('A' AS VARCHAR(500))  As Name
    UNION SELECT CAST('-A' AS VARCHAR(500))  AS NAME
    ) As t
    ORDER BY t.Name ASC
    

    产生(我想要的)输出:

    -A

    (带前导破折号的先显示)

    将其与nvarchar值的顺序进行对比:

    SELECT t.Name
    FROM
    ( 
    SELECT CAST('A' AS NVARCHAR(500))  As Name
    UNION SELECT CAST('-A' AS NVARCHAR(500))  AS NAME
    ) As t
    ORDER BY t.Name ASC
    

    它产生这个输出:


    -A

    假设我想使用标准ORDER BY子句对nvarchar字段进行排序(我不能更改数据库设计)(我使用的是linq2nhib,它阻止我在这里进行任何转换)-我如何使排序以所需的方式工作(先显示前导非字母数字值的项)?

    我希望有某种数据库/服务器级别的排序设置…有什么想法吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Msonic Naveen Sharma    12 年前

    您需要使用二进制排序规则来实现一致的排序。

    ORDER BY t.Name ASC COLLATE Latin1_General_BIN
    

    编辑: 因为不能在查询中进行排序, 您将需要在数据库级别执行此操作。

    您需要在要比较的列上设置它,并且它必须是二进制的。

    Here 就是一个例子。

        2
  •  1
  •   Yogesh Sharma    7 年前

    要么更改数据库中的排序规则,要么更改需要一致排序的表中各个列的排序规则。

    排序规则 Latin1_General_BIN or Latin1_General_BIN2 用你的例子做得很好。

        3
  •  0
  •   Pedro Fialho    11 年前

    您还可以在返回主键的CTE上对set with cast(varchar)进行排序,并在表上执行join以获取nvarchar值。