【问题标题】:SQL Server 2008 - different sort orders on VARCHAR vs NVARCHAR valuesSQL Server 2008 - VARCHAR 与 NVARCHAR 值的不同排序顺序
【发布时间】:2011-03-13 22:12:45
【问题描述】:

在 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 值上的 ORDER 进行对比:

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,这会阻止我在这里进行任何转换) - 我如何获得排序以所需的方式工作(首先显示具有前导非字母数字值的项目)?

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

【问题讨论】:

  • 此处描述了该行为的原因。 support.microsoft.com/kb/322112我不确定是否有办法绕过它。使用二进制排序规则对您有用吗? social.msdn.microsoft.com/Forums/en/transactsql/thread/…
  • 感谢您的评论,它准确地描述了我所看到的行为......现在我只需要一个解决方案!我不介意更改数据库上的排序规则设置,是否有一个可以产生我想要的结果(并且仍然允许 unicode 列等)?
  • 您可以使用ORDER BY t.Name COLLATE Latin1_General_BIN ASC,但这会将大小写名称分开。更多讨论在这里blogs.msdn.com/b/sqlprogrammability/archive/2006/04/07/…
  • Martin,正如问题中提到的,我在 order by 中真的没有什么特别之处,因为我正在使用 NHibernate.Linq 来执行查询,我可以期望得到它是标准的 ORDER BY col 语句....
  • 你知道,仅仅因为你对一些 qwueries 使用 ORM 并不意味着你不能让它执行一个 spred proc 或查询,如果你需要用更好、更复杂或比生成的 ORM 代码更高效的方式。如果某个工具不能满足您的需求,请停止使用该工具。

标签: sql tsql sql-server-2008


【解决方案1】:

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

排序规则Latin1_General_BIN or Latin1_General_BIN2 与您的示例配合得很好。

【讨论】:

    【解决方案2】:

    您还可以在返回主键的 CTE 上使用 CAST(VARCHAR) 对集合进行排序,并对表进行连接以获得 NVARCHAR 值。

    【讨论】:

      【解决方案3】:

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

      ORDER BY t.Name ASC COLLATE Latin1_General_BIN
      

      编辑: 由于您无法在查询中进行整理, 您需要在数据库级别执行此操作。

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

      Here 就是一个例子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多