在 SQL Server 2012 中将两个 nvarchar 列与 Unicode 文本进行比较

Posted

技术标签:

【中文标题】在 SQL Server 2012 中将两个 nvarchar 列与 Unicode 文本进行比较【英文标题】:Compare two nvarchar columns with Unicode text in SQL server 2012 【发布时间】:2016-04-18 09:28:37 【问题描述】:

在 MS SQL Server 2012 中,我想比较包含 Unicode 文本的数据类型为 nvarchar 的两列。

即使值不同,以下查询也不会返回任何内容。

DECLARE @TABLE TABLE(
    A nvarchar(100),
    B nvarchar(100)
);

INSERT INTO @TABLE VALUES (N'A²', N'A2')

SELECT *
FROM @TABLE 
WHERE A <> B;

我尝试了二进制排序规则,它可以工作:

DECLARE @TABLE TABLE(
    A nvarchar(100),
    B nvarchar(100)
);

INSERT INTO @TABLE VALUES (N'A²', N'A2');

SELECT *
FROM @TABLE 
WHERE A COLLATE Latin1_General_BIN = B COLLATE Latin1_General_BIN;

还有其他选择吗?或者只能通过排序来完成?

【问题讨论】:

Afaik,您需要使用不同的排序规则,因为即使值 A2 和 A^2 的校验和相同 Latin1_General_BIN 排序规则有效,比较很好。我需要使用不同的排序规则是什么意思? 【参考方案1】:

还有其他选择吗?或者只能通过排序来完成?

是的,例如HASHBYTES:

DECLARE @TABLE TABLE(A nvarchar(100),B nvarchar(100));
INSERT INTO @TABLE VALUES (N'A²', N'A2')

SELECT *
FROM @TABLE 
WHERE HASHBYTES('SHA2_256',A) <> HASHBYTES('SHA2_256',B);

LiveDemo

输出:

╔════╦════╗
║ A  ║ B  ║
╠════╬════╣
║ A² ║ A2 ║
╚════╩════╝

无论如何,整理解决方案是最干净的解决方案。

【讨论】:

【参考方案2】:

另一种选择是:

SELECT
  *
FROM
  @TABLE 
WHERE 
  CAST(A AS VARBINARY(MAX))<>CAST(B AS VARBINARY(MAX));

打印出表格中的一行

【讨论】:

以上是关于在 SQL Server 2012 中将两个 nvarchar 列与 Unicode 文本进行比较的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中将两个表合并到一个索引视图中

如何在sql server中将列转换为行

在 SQL Server 中将 Bool 转换为 Bit

如何在SQL Server中将datetime值转换为yyyymmddhhmmss?

sql server 2012复制数据库在同一主机上的两个实例之间失败

如何实现 sql2008 和 sql2012 共存?