为什么在SQL Server中,[空字符串]和[NULL]是相同的?

5
在SSMS v17.9中,连接到一个SQL Server 14.0.1000实例时,系统会将这两个字符视为相同: 我创建了一个“[Kanji]”表,将[NVARCHAR(2)]的[Char]列设置为主键。在添加了“”之后,我无法添加“”,因为会引发“键重复”错误。
我运行了以下T-SQL:
IF ( N'' = N'') PRINT 'true' ELSE PRINT 'false'

结果会输出“true”。

你的排序规则是什么? - ta.speot.is
哦,现在我明白问题出在选择的排序规则上了。谢谢。 - leanhluudan
3个回答

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'

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

了解更多有关排序规则的信息


谢谢。我明白了。 - leanhluudan

3
根据维基百科的定义:https://en.wikipedia.org/wiki/Collation 一个诸如 Unicode 排序算法的算法,通过比较两个给定的字符串并决定哪一个应该排在前面,来定义一个顺序。当以这种方式定义了顺序后,可以使用排序算法将任意数量的项目列表按照此顺序排序。
当引用 SQL Server 没有关于它的任何情景的字符时,SQL Server 将其视为 '?' 字符,因此您会看到 字符是相同的,因为都被视为?
为了防止这种行为,您需要在数据库或表列或字符串文字上配置合适的排序规则。
因此,如 @Hiran 所发表的(https://dev59.com/HrPma4cB1Zd3GeqPzPyQ#56220111),您需要配置适当的排序规则。
在 SQL Server 中了解更多关于排序规则的信息:https://learn.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

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

SELECT N'' COLLATE <Your Collation>

2
除了校对,我建议您查看Unicode代码点或二进制表示:

除了校对,我建议您查看Unicode代码点或二进制表示:

。最初的回答
SELECT UNICODE(N''), CAST(N'' AS BINARY(4))
     , UNICODE(N''), CAST(N'' AS BINARY(4))

最初的回答

结果

55384   0x58D84CDF  
55391   0x5FD8B7DF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接