为什么SQL Server认为两个完全不同的字符串相同?

时间:2013-05-26 18:56:59

标签: sql-server

在我的sql server中:

select case when  N'ܐܪܡܝܐ' = N'አማርኛ' then 1 else 0 end

生成1。我也可以重现这个here。任何人都可以向我解释原因吗?

3 个答案:

答案 0 :(得分:2)

特定的排序规则不需要包含Unicode中定义的每个代码点的排序信息。

如果您只需要测试(二进制)字符串相等,忽略每个排序顺序,请使用Latin1_General_BIN排序规则(或任何other collation ending in _BIN or _BIN2):

select case 
    when N'ܐܪܡܝܐ' COLLATE Latin1_General_BIN = N'አማርኛ' COLLATE Latin1_General_BIN 
    then 1 else 0 end

答案 1 :(得分:1)

评论太长了,所以我再添一个答案,提到@JBrooks的回答:

执行

时会发生什么
select ascii('ܐ') AA, ascii('አ') AB

首先,字符串文字(Unicode代码点高于ASCII范围)将转换为“?”因为它们没有标记为Unicode字符串(N'')。

然后,函数ASCII在非Unicode字符串'?'上执行,这显然会导致63。

所以我们只需添加Unicode字符串标记N''

select ascii(N'ܐ') AA, ascii(N'አ') AB

同样,对于两个表达式,结果都是63,但是通过不同的路径:当字符串声明为Unicode时,ASCII()函数将其参数视为非Unicode字符串,从而得到结果63.

获取两个Unicode字符的实际代码点,需要应用UNICODE()函数:

select unicode(N'ܐ') AA, unicode(N'አ') AB

正确导致1808和4768。

最后一个问题:为什么要问号?

来自Wikipedia

  

问号字符也常用于代替遗失或   未知数据。在Unicode中,它是在U + 003F编码的?问号   (HTML:?)。

并且,在文章的下面

  

在许多网络浏览器和其他计算机程序中,“?”用来表示   在程序的字符集中找不到的字符。 [...]一些字体   而是使用Unicode替换字形(U + FFFD, ),这是   通常在黑色钻石中呈现为白色问号(参见   替换人物)。

那么'?'问号可以看作是Unicode Replacement Character U+FFFD的ASCII等价物,它本身不能用ASCII值表示。

答案 2 :(得分:0)

如果我这样做,他们都会回来63。

select ascii('ܐ') AA, ascii('አ') AB