为什么在T-SQL中某些unicode字符等于零?

为什么在T-SQL中某些unicode字符等于零?,sql,string,tsql,unicode,Sql,String,Tsql,Unicode,在我的数据库中,我有一个翻译表,其中包含将不常见的Unicode字符转换为英语字符的字典。Unicode字符是此表的主键。 不久前,我遇到了一个问题:一些不同的Unicode字符对于T-SQL是相同的,它们同时等于零 我发现区分它们的方法“=”是无用的,甚至可以将其中一个插入到数据库中。但是我不能再插入一个,因为主键约束,而它们都是相等的 我只发现了4个:ȘșȚț。但是4只足够破坏我的系统 这是一个简短但信息丰富的例子,说明了它们的行为: DECLARE @Strings TABLE(id in

在我的数据库中,我有一个翻译表,其中包含将不常见的Unicode字符转换为英语字符的字典。Unicode字符是此表的主键。 不久前,我遇到了一个问题:一些不同的Unicode字符对于T-SQL是相同的,它们同时等于零

我发现区分它们的方法“=”是无用的,甚至可以将其中一个插入到数据库中。但是我不能再插入一个,因为主键约束,而它们都是相等的

我只发现了4个:ȘșȚț。但是4只足够破坏我的系统

这是一个简短但信息丰富的例子,说明了它们的行为:

DECLARE @Strings TABLE(id int, ucode nvarchar(50))
INSERT INTO @Strings (id, ucode)
    SELECT 1, N'A' UNION -- Usual char
    SELECT 2, N'Ы' UNION -- Some unicode char    
    SELECT 3, N'Ф' UNION -- Another unicode char
    SELECT 5, N' ' UNION -- space
    SELECT 6, N'Ș' UNION -- Unusual unicode char
    SELECT 7, N'Ț' UNION -- Unusual unicode char
    SELECT 8, N'some_string' UNION      -- example string
    SELECT 9, N'some_string ' UNION     -- example string with space
    SELECT 10, N'some_string Ș' UNION   -- example string with unusual char
    SELECT 11, N'some_string Ț'         -- one more

 SELECT * FROM @Strings
 SELECT * FROM @Strings WHERE ucode = N'A'  -- Good one (1 result)
 SELECT * FROM @Strings WHERE ucode = N'Ș'  -- Magic (3 results)
 SELECT * FROM @Strings WHERE ucode = N'Ț'  -- Magic (3 results)
 SELECT * FROM @Strings WHERE ucode = ''    -- Magic (3 results)
 SELECT * FROM @Strings WHERE ucode = 'some_string' -- Magic (4 results)
你有什么建议吗?

=没有什么用处,但是你需要指定=应该如何比较。默认值是在数据库级别设置的,并且您的列不指定不同的比较规则,因此您的列将获取数据库的比较规则。主键使用与=相同的比较规则,因此为其中一个键修复它也会使另一个键按预期工作

指定比较规则是使用完成的。一种应该将所有代码点视为不同字符的排序规则是Latin1\u General\u BIN2

=不是无用的,但是您需要指定=应该如何比较。默认值是在数据库级别设置的,并且您的列不指定不同的比较规则,因此您的列将获取数据库的比较规则。主键使用与=相同的比较规则,因此为其中一个键修复它也会使另一个键按预期工作

指定比较规则是使用完成的。一种应该将所有代码点视为不同字符的排序规则是Latin1\u General\u BIN2


您使用的排序规则和版本是什么?Martin Smith,我尝试了SQL\u Latin1\u General\u CP1\u CI\u AS和西里尔语\u General\u CI\u Asa以及您希望区分大小写和重音的语义是什么?Martin Smith,区分大小写和重音。您使用的排序规则和版本是什么?Martin Smith,我试过使用SQL拉丁语和西里尔语来区分大小写和重音,你想要的区分大小写和重音的语义是什么?Martin Smith,区分大小写和重音。
DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2)