在 SSMS v17.9 中,连接到 SQL Server 14.0.1000 实例时,系统将这两个字符视为相同:和
我设置了一个 [Char] NVARCHAR(2) 作为主键的 [Kanji] 表。添加“”后,我无法添加“”,因为它引发了“密钥重复”错误。
我运行了这个 T-SQL:
IF ( N'' = N'') PRINT 'true' ELSE PRINT 'false'
结果打印出“真”。
在 SSMS v17.9 中,连接到 SQL Server 14.0.1000 实例时,系统将这两个字符视为相同:和
我设置了一个 [Char] NVARCHAR(2) 作为主键的 [Kanji] 表。添加“”后,我无法添加“”,因为它引发了“密钥重复”错误。
我运行了这个 T-SQL:
IF ( N'' = N'') PRINT 'true' ELSE PRINT 'false'
结果打印出“真”。
你必须使用正确的排序规则,
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 语句或 DB 对象级别动态设置
基于维基百科的定义:https ://en.wikipedia.org/wiki/Collation
诸如 Unicode 排序算法之类的排序算法通过比较两个给定字符串并决定哪个应该在另一个之前的过程来定义一个顺序。当以这种方式定义订单时,可以使用排序算法将任意数量的项目列表放入该订单中。
当你提到一个字符时,那个SQL Server没有任何关于它的场景,那么SQL Server会把它当作?
字符,所以你会看到和
字符是一样的,因为两者都被当作
?
为了防止这种行为,您需要在数据库或表列或字符串文字上配置合适的排序规则。
因此,正如@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
在字符串文字上设置排序规则:
SELECT N'' COLLATE <Your Collation>
除了排序规则,我建议查看unicode 代码点或二进制表示:
SELECT UNICODE(N''), CAST(N'' AS BINARY(4))
, UNICODE(N''), CAST(N'' AS BINARY(4))
结果
55384 0x58D84CDF
55391 0x5FD8B7DF