为什么'Weiss'='Weiß'或通过Unicode列在SQL Server中搜索

Che*_*ven 1 c# sql-server unicode

我在SQL Server中定义了列,nvarchar结果(我认为)'Weiss'=='Weiß'.但在我的c#代码'Weiss'中!='Weiß'

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Tags]
(
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](125) NOT NULL,
    [IsBlocked] [bit] NOT NULL,
    [Created] [datetimeoffset](7) NOT NULL,
    [Updated] [datetimeoffset](7) NOT NULL,

    CONSTRAINT [PK_dbo.Tags] 
    PRIMARY KEY CLUSTERED ([Id] ASC)
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
              IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
              ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

在SQL Server中:

SELECT *
FROM [Tags]
WHERE Value = 'Weiss Kreuz'
Run Code Online (Sandbox Code Playgroud)

返回值为'WeißKreuz'的行

有人可以解释一下这种情况如何以及如何在c#和SQL Server中进行相同的比较?

Mar*_*age 6

你可能知道德语的德语字母eszett(ß)德语中被用来代替double-s.因此,如果您对WeissWeiß(意为白色)这两个词进行UNICODE比较,则它们被认为是相同的.

在C#中,您可以使用以下方法进行UNICODE比较(也称为文化敏感比较)String.Compare:

String.Compare("Weiss", "Weiß")
Run Code Online (Sandbox Code Playgroud)

这将返回0,表示两个字符串相等.

使用equals运算符:

"Weiss" == "Weiß"
Run Code Online (Sandbox Code Playgroud)

返回false但此运算符使用区域不敏感的比较.

SQL Server使用排序规则处理字符串的排序和比较.早期版本的SQL Server使用的规则与Windows使用的规则(以及.NET/C#)不同,但现在SQL Server排序规则已与Windows中的UNICODE规则保持一致.

这提供了SQL Server中数据类型之间的一致性,并且还允许开发人员使用SQL Server使用的相同规则对其应用程序中的字符串进行排序.