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

时间:2016-01-13 11:58:48

标签: sql sql-server tsql sql-server-2012 collation

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

还有其他选择,还是只能通过整理来完成?

2 个答案:

答案 0 :(得分: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 ║
╚════╩════╝

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

答案 1 :(得分:1)

另一种选择是:

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

打印出表格中的一行