具有不可打印字符的SQL Server排序顺序

时间:2012-06-19 18:28:51

标签: sql sql-server tsql ascii

我有一个标量值函数,它返回包含ASCII单元分隔符Char(31)的varchar数据。我将此结果用作Order By子句的一部分,并尝试按升序排序。

我的标量值函数返回如下结果(拼出不可打印的字符以供参考)

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

我希望当我按升序排序时,结果如下:

  • ABC
  • ABCDEF
  • ABCDEFHIJ

相反,我认为结果完全相反:

  • ABCDEFHIJ
  • ABCDEF
  • ABC

现在我相当肯定这与不可打印的角色有关,但我不确定为什么。知道为什么会这样吗?

由于

2 个答案:

答案 0 :(得分:5)

排序顺序可能会受到COLLATION设置的影响。在脚本之后,明确使用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;

答案 1 :(得分:1)

我能够在SQL Server 2008 R2中复制此行为,并将排序规则设置为SQL_Latin1_General_CP1_CI_AS

如果您无法更改整理设置,请将字段设置为nvarchar而不是varchar。这解决了我的问题。