为什么撇号 (') 排在其他 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_BIN
或 order 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
数据库: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_BIN
或 order 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