为什么撇号 (') 排在其他 ASCII 字符之前?

Why is apostrophe (') sorted before other ASCII characters?

数据库:Azure 专用 SQL 池

整理:SQL_Latin1_General_CP1_CI_AS

create table testtable (timeenter nvarchar(30))

insert into testtable values('08:19:21''')
insert into testtable values('08:19:21$')
insert into testtable values('08:19:21%')
insert into testtable values('08:19:21(')
insert into testtable values('08:19:21"')

这是我的问题,当我对值进行排序时,我得到了这个:

select *
from (
    select timeenter
        , ascii(right(timeenter,1)) as ascvalue
        , right(timeenter,1) as symbol
    from testtable 
) x
order by timeenter

结果集:

timeenter                      ascvalue    symbol
------------------------------ ----------- ------
08:19:21'                      39          '
08:19:21"                      34          "
08:19:21$                      36          $
08:19:21%                      37          %
08:19:21(                      40          (

当我用这个排序时:order by timeenter collate Latin1_General_BINorder by timeenter collate SQL_Latin1_General_CP850_BIN,它正确排序:

timeenter                      ascvalue    symbol
------------------------------ ----------- ------
08:19:21"                      34          "
08:19:21$                      36          $
08:19:21%                      37          %
08:19:21'                      39          '
08:19:21(                      40          (

我查看了 SQL_Latin1_General_CP1_CI_AS 排序规则,CP1 显示字符集排序正确,但排序顺序在我的查询实例中仍然不规则。

是不是因为撇号(')是SQL的分隔符?

非常感谢任何见解。

我正在寻找的答案是我的实例如何以及为什么基于当前排序规则对它进行排序。我可以通过 tsql 轻松地按照我想要的方式对数据进行排序。根据我的示例,我只是在寻找有关排序规则及其与撇号的行为方式的解释。

这很奇怪。 " < ' in SQL_Latin1_General_CP1_CI_AS,如您所见

select case when '''' collate SQL_Latin1_General_CP1_CI_AS < '"' collate SQL_Latin1_General_CP1_CI_AS then 1 else 0 end

产出

0

但如果是unicode字符,则顺序相反:

select case when N'''' collate SQL_Latin1_General_CP1_CI_AS < N'"' collate SQL_Latin1_General_CP1_CI_AS then 1 else 0 end

产出

1