在 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中将datetime值转换为yyyymmddhhmmss?