SELECT DISTINCT返回意外值

时间:2018-07-30 22:34:25

标签: sql-server

我的SQL Server 2016数据库使用归类SQL_Latin1_General_CP1_CI_AS。当我运行此查询时...

select distinct x from (
select '²' as x
union all
select '2'
) y 

select distinct x from (
select N'²' as x
union all
select N'2'
) y 

VARCHAR版本将两个字符视为不同; NVARCHAR版本将它们视为相同。

到底发生了什么?

2 个答案:

答案 0 :(得分:1)

显然,它们被视为与nvarchar相同的字符的大写和小写版本。如果您运行此区分大小写的查询:

select Distinct x from (
select N'2' COLLATE SQL_Latin1_General_CP1_CS_AS  as x
UNION ALL
select N'²' COLLATE SQL_Latin1_General_CP1_CS_AS as x
) y 

您将获得以下输出:

x
2
²

答案 1 :(得分:1)

  

VARCHAR版本将两个字符视为不同

默认的数据库dplyr::lag CoLLATE在这里起作用。

(COLLATE SQL_Latin1_General_CP1_CI_AS)COLLATE SQL_Latin1_General_CP1_CI_AS的值varchar'²'视为两个不同的值。

对于NVARCHAR '2',将'²'和'2'视为相同的值。

与ACSII或UNICODE无关