【问题标题】:Compare two nvarchar columns with Unicode text in SQL server 2012在 SQL Server 2012 中将两个 nvarchar 列与 Unicode 文本进行比较
【发布时间】: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 排序规则有效,比较很好。我需要使用不同的排序规则是什么意思?

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


【解决方案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));
    

    打印出表格中的一行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      相关资源
      最近更新 更多