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

标签 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]


在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/

相关文章:

sql - 我可以使用别名作为过滤器吗? T-SQL 2012

sql-server - 世界上最大的SQL Server数据库安装大小是多少?

php - 统计 ASCII 和 Unicode 混合字符串中的字符数

c# - 如何使 DataGrid 在 WPF 中始终显示其列标题?

c# - 编写一个在 EF Core 中不区分大小写的搜索查询?

c# - SortedDictionary 将一个 SortedDictionary 添加到另一个

c# - 将 CaSTLe.Windsor 与 SSW Data Onion 一起用于 Entity Framework 6

SQL 如何使用内部查询正确组合 MAX 和 COUNT

PHP MySQL 查询返回错误字符

python - 如何使用 unicode 字符重命名/替换所有文件和关联文件夹的特定关键字?