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

时间:2013-01-08 17:22:44

标签: sql string tsql 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)

你有什么建议吗?

1 个答案:

答案 0 :(得分:5)

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

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

DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2)