首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘Weiss’=‘Wei?’或在SQL Server中搜索over Unicode列

为什么‘Weiss’=‘Wei?’或在SQL Server中搜索over Unicode列
EN

Stack Overflow用户
提问于 2015-03-14 13:03:27
回答 2查看 405关注 0票数 1

我在SQL Server中将列定义为nvarchar,因此(我想)‘Weiss’==‘Wei«’。但是在我的c#代码‘Weiss’!=‘Wei’

代码语言:javascript
复制
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中:

代码语言:javascript
复制
SELECT *
FROM [Tags]
WHERE Value = 'Weiss Kreuz'

返回值为‘Wei’的行

谁能解释一下这种情况是如何发生的,以及如何在c#和SQL Server中进行相同的比较?

EN

回答 2

Stack Overflow用户

发布于 2015-03-14 14:37:49

您可能知道,在德语中,the German letter eszett (ß)在某些单词中用来代替双-s。因此,如果用UNICODE对单词Weiss和Wei§(表示白色)进行比较,就会认为它们是相同的。

在C#中,可以使用String.Compare进行UNICODE比较(也称为区分区域性的比较)。

代码语言:javascript
复制
String.Compare("Weiss", "Weiß")

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

使用等于运算符:

代码语言:javascript
复制
"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相同的规则对应用程序中的字符串进行排序。

票数 6
EN

Stack Overflow用户

发布于 2015-03-14 14:30:44

这完全取决于排序规则和如何进行比较:

代码语言:javascript
复制
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版本,或者因为兼容性原因,它们做事情的方式不同)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29045662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档