admin

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

sql

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

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

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

我希望当我通过升序订购时,结果如下:

  • ABC
  • ABCDEF
  • ABCDEFHIJ

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

  • ABCDEFHIJ
  • ABCDEF
  • ABC

现在,我相当确定这与不可打印字符有关,但是我不确定为什么。知道为什么会这样吗?

谢谢


阅读 220

收藏
2021-07-01

共1个答案

admin

排序顺序可能会受到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;
2021-07-01