在处理来自中国的一些数据时,我偶然发现了一些有趣的行为。无论出于何种原因,他们都有传统的开放式支架(U + 0028)与“全宽”开放式支架(U + FF08)混合的记录。 现在,C#通过测试知道它们并不相同:
char a = Convert.ToChar(40);
char b = Convert.ToChar(65288);
string g = Convert.ToString(Convert.ToChar(40));
string h = Convert.ToString(Convert.ToChar(65288));
if (a == b) throw new Exception();
if (g == h) throw new Exception();
Excel也知道它们不相同,但SQL 2008认为它们是等价的:
--should be false and return nothing
select 1 where N'(' = N'('
--is false and returns nothing
select 1 where N'租' = N'('
--should be false and return nothing
select 1 where NCHAR(40) = NCHAR(65288)
所以,我认为我在这里遗漏了一些东西,但是有一个特定于Unicode的相等操作,它会明确地支持这种相等性(而不是逻辑上不相等)。我也对其他语言如何处理这种行为感兴趣,因为我正在使用Qlik这个数据,而Qlik的内部引擎在搜索时将两个字符串识别为等效,但在加载数据时却没有(yay一致性!)< / p>
我还猜测结束括号和其他标点符号存在相同的行为,但是如果存在特定的SQL相等运算符(或其他语言),则无论如何都会解决此问题。
有punctuation characters in Wikipedia here的完整列表, 以及accented character equality
的类似问题从@ZLK开始,SQL就是整理。使用此处的代码 SQL Server 2008 and Unicode Character comparison 看起来所有_BIN,_BIN2和_WS(Width-Sensitive!)排序规则都按预期工作。