我在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’的行
谁能解释一下这种情况是如何发生的,以及如何在c#和SQL Server中进行相同的比较?
发布于 2015-03-14 14:37:49
您可能知道,在德语中,the German letter eszett (ß)在某些单词中用来代替双-s。因此,如果用UNICODE对单词Weiss和Wei§(表示白色)进行比较,就会认为它们是相同的。
在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相同的规则对应用程序中的字符串进行排序。
发布于 2015-03-14 14:30:44
这完全取决于排序规则和如何进行比较:
string str1 = "Weiss";
string str2 = "Weiß";
bool res = string.Compare(str1, str2) == 0;
bool res2 = string.Equals(str1,str2,StringComparison.CurrentCulture);其中,如果两个字符串相等,则string.Compare返回0。
来自string.Compare msdn:
比较使用当前区域性来获取区域性特定的信息,如大小写规则和单个字符的字母顺序
和string.Equals(string, string)
此方法执行顺序(区分大小写和不区分区域性)比较。
和string.Equals(string, string, StringComparison)
comparisonType参数指示比较是使用当前区域性还是不变区域性、使用要比较的两个字符串的大小写还是使用单词或序号排序规则。
如果你环顾四周(例如SQL query that distinguishes between ß and ss),你会发现在许多sql排序规则中都知道ss == ß。
在一般情况下,您不应该重新排序按SQL排序的客户端内容,也不应该重新比较按SQL排序的客户端内容,因为SQL的排序规则和.NET的排序规则在小事情上是不同的(通常是因为它们使用不同的Unicode版本,或者因为兼容性原因,它们做事情的方式不同)。
https://stackoverflow.com/questions/29045662
复制相似问题