SQL Server的排序顺序与非打印字符(SQL Server sort order with n

2019-09-26 08:49发布

我有返回包含ASCII单元分隔符字符(31)的数据的一个varchar的标量值函数。 我使用这个结果作为订单的一部分By子句,并试图以升序进行排序。

我的标量值函数返回结果如下述(阐明了参考不可打印的字符)

  • ABC
  • ABC(CHAR(31))DEF
  • ABC(CHAR(31))DEF(CHAR(31))HIJ

我希望,当我被上升的结果排序是以下几点:

  • ABC
  • ABCDEF
  • ABCDEFHIJ

而不是我看到的结果完全相反:

  • ABCDEFHIJ
  • ABCDEF
  • ABC

现在我相当肯定,这与非打印字符做的,但我不知道为什么。 任何想法,为什么是这样?

谢谢

Answer 1:

该排序顺序可以通过你的影响整理设置。 下面的脚本,明确使用Latin1_General_CI_AS作为整理顺序的项目,如你所期望的。

;WITH q (Col) AS (
    SELECT 'ABC' UNION ALL
    SELECT 'ABC' + CHAR(31) + 'DEF' UNION ALL
    SELECT 'ABC' + CHAR(31) + 'DEF' + CHAR(31) + 'HIJ'
)
SELECT  *
FROM    q   
ORDER BY
        Col COLLATE Latin1_General_CI_AS

什么是您使用排序规则? 您可以验证当前的数据库排序规则设置与

SELECT DATABASEPROPERTYEX('master', 'Collation') SQLCollation;


Answer 2:

我能够复制在SQL Server 2008 R2此行为与整理设置为SQL_Latin1_General_CP1_CI_AS

如果你不能改变你的排序规则设置,设置现场nvarchar ,而不是varchar 。 这解决了这个问题对我来说。



文章来源: SQL Server sort order with nonprintable characters