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

y.s*_*hyk 1 sql t-sql string unicode

在我的数据库中,我有翻译表,其中包含用于将异常Unicode字符转换为英文字符的字典.Unicode字符是此表的主键.前段时间我遇到了一个问题:T-SQL的一些不同的Unicode字符是相同的,它们同时没有任何内容.

我可以找到区分彼此的方式('='没用),甚至设法将其中一个插入数据库.但是由于主键限制而我们不能插入多于一个,而它们都是相同的.

我发现只有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)
Run Code Online (Sandbox Code Playgroud)

你有什么建议吗?

小智 5

=并非无用,但你需要指明=应该如何比较.默认值在数据库级别设置,并且您的列未指定不同的比较规则,因此您的列将获取数据库的比较规则.主键使用相同的比较规则=,因此将其固定为一个也可以使另一个按照您的意图工作.

使用COLLATE关键字指定比较规则.应将所有代码点视为不同字符的一种排序规则是Latin1_General_BIN2.

DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2)
Run Code Online (Sandbox Code Playgroud)