在我的数据库中,我有翻译表,其中包含用于将异常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)
你有什么建议吗?
答案 0 :(得分:5)
=
并非无用,但您需要指定=
应该如何比较。默认值在数据库级别设置,并且您的列未指定不同的比较规则,因此您的列将获取数据库的比较规则。主键使用与=
相同的比较规则,因此将其修复为一个也可以使另一个按照您的意图工作。
使用COLLATE
keyword指定比较规则。应将所有代码点视为不同字符的一种排序规则是Latin1_General_BIN2
。
DECLARE @Strings TABLE(id int, ucode nvarchar(50) COLLATE Latin1_General_BIN2)