1

在我的数据库中,我有一个翻译表,其中包含用于将不寻常的 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)

你有什么建议吗?

4

1 回答 1

5

=不是没用,但你需要指定=应该如何比较。默认是在数据库级别设置的,你的列没有指定不同的比较规则,所以你的列获取数据库的比较规则。主键使用与 相同的比较规则=,因此为一个主键修复它也会使另一个按您的意愿工作。

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

DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2)
于 2013-01-08T17:33:17.580 回答