为什么在SQL Server中相同

时间:2019-05-20 11:18:13

标签: sql-server tsql kanji

在SSMS v17.9中,连接到SQL Server 14.0.1000实例时,系统将以下两个字符视为相同:

我设置了一个以[Char] NVARCHAR(2)作为主键的[Kanji]表。添加“”后,我无法添加“”,因为它引发了“密钥重复”错误。

我运行了这个T-SQL:

IF ( N'' = N'') PRINT 'true' ELSE PRINT 'false'

结果打印出“ true”。

3 个答案:

答案 0 :(得分:6)

您必须使用适当的排序规则,

IF ( N'' COLLATE Chinese_Simplified_Stroke_Order_100_CI_AI = N'' COLLATE Chinese_Simplified_Stroke_Order_100_CI_AI) PRINT 'true' ELSE PRINT 'false'

排序规则可以在select语句中或在数据库对象级别中即时设置

read more about collations

答案 1 :(得分:3)

基于维基百科的定义:https://en.wikipedia.org/wiki/Collation

  

诸如Unicode归类算法的归类算法通过比较两个给定字符串并确定哪个字符串应排在另一个字符串之前的过程来定义顺序。通过这种方式定义了订单后,可以使用排序算法将该订单中任意数量的商品放入清单。

当您提到一个字符时,该SQL Server没有任何场景,则SQL Server将其视为?字符,因此您将看到和{{1 }}字符相同,因为它们都被视为

为防止此类行为,您需要在数据库或表列或字符串文字上配置适当的排序规则。

因此@Hiran发布(https://stackoverflow.com/a/56220111/1666800)时,您需要配置合适的排序规则。

了解有关SQL Server中的排序规则的更多信息:https://docs.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-2017

以下代码将帮助您配置排序规则:

在数据库上设置排序规则:

?

在表列上设置排序规则:

ALTER DATABASE <Database>
COLLATE <Your Collation> ;
GO

在字符串文字上设置排序规则:

USE <Database>
GO
ALTER TABLE <Table Nme>
ALTER COLUMN <Column Name> <Data Type>
COLLATE <Your Collation> <Other options>
GO

答案 2 :(得分:2)

除了建议使用的归类外,还建议查看 unicode代码点或二进制表示形式

SELECT UNICODE(N''), CAST(N'' AS BINARY(4))
     , UNICODE(N''), CAST(N'' AS BINARY(4))

结果

55384   0x58D84CDF  
55391   0x5FD8B7DF
相关问题