在 SQL 服务器 2012 中比较两个 nvarchar 列与 Unicode 文本
Compare two nvarchar columns with Unicode text in SQL server 2012
在 MS SQL Server 2012 中,我想比较数据类型为 nvarchar 且包含 Unicode 文本的两列。
以下查询 returns 什么都没有,甚至认为值不同。
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;
是否有任何其他选项或者只能通过整理来完成?
Is there any other option or can this only be done with collation?
是的,例如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);
输出:
╔════╦════╗
║ A ║ B ║
╠════╬════╣
║ A² ║ A2 ║
╚════╩════╝
无论如何,整理解决方案是最干净的解决方案。
另一种选择是:
SELECT
*
FROM
@TABLE
WHERE
CAST(A AS VARBINARY(MAX))<>CAST(B AS VARBINARY(MAX));
打印出 table
中的一行
在 MS SQL Server 2012 中,我想比较数据类型为 nvarchar 且包含 Unicode 文本的两列。
以下查询 returns 什么都没有,甚至认为值不同。
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;
是否有任何其他选项或者只能通过整理来完成?
Is there any other option or can this only be done with collation?
是的,例如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);
输出:
╔════╦════╗
║ A ║ B ║
╠════╬════╣
║ A² ║ A2 ║
╚════╩════╝
无论如何,整理解决方案是最干净的解决方案。
另一种选择是:
SELECT
*
FROM
@TABLE
WHERE
CAST(A AS VARBINARY(MAX))<>CAST(B AS VARBINARY(MAX));
打印出 table
中的一行