我在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]
在SQL Server中:
SELECT *
FROM [Tags]
WHERE Value = 'Weiss Kreuz'
返回值为“WeißKreuz”的行
有人可以解释这种情况如何发生,以及如何在c#和SQL Server中进行比较吗?
最佳答案
您可能知道用the German letter eszett (ß)代替德语中的double -s。因此,如果您对Weiss和Weiß(意为怀特)一词进行UNICODE比较,则它们被认为是相同的。
在C#中,您可以使用String.Compare
进行UNICODE比较(也称为对文化敏感的比较):
String.Compare("Weiss", "Weiß")
这将返回0,表示两个字符串相等。
使用等于运算符:
"Weiss" == "Weiß"
返回false,但是此运算符使用不区分区域性的比较。
SQL Server handles sorting and comparison of strings using a collation。早期版本的SQL Server使用的规则与Windows使用的规则(以及.NET / C#)不同,但是现在SQL Server排序规则已与Windows中的UNICODE规则对齐。
这提供了SQL Server中各种数据类型的一致性,还使开发人员可以使用与SQL Server相同的规则对应用程序中的字符串进行排序。
关于c# - 为什么'Weiss'='Weiß'或通过Unicode列在SQL Server中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29045662/