在我的sql server中:
select case when N'ܐܪܡܝܐ' = N'አማርኛ' then 1 else 0 end
生成1
。我也可以重现这个here。任何人都可以向我解释原因吗?
答案 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。
最后一个问题:为什么要问号?
问号字符也常用于代替遗失或 未知数据。在Unicode中,它是在U + 003F编码的?问号 (HTML:?)。
并且,在文章的下面
在许多网络浏览器和其他计算机程序中,“?”用来表示 在程序的字符集中找不到的字符。 [...]一些字体 而是使用Unicode替换字形(U + FFFD, ),这是 通常在黑色钻石中呈现为白色问号(参见 替换人物)。
那么'?'问号可以看作是Unicode Replacement Character U+FFFD的ASCII等价物,它本身不能用ASCII值表示。
答案 2 :(得分:0)
如果我这样做,他们都会回来63。
select ascii('ܐ') AA, ascii('አ') AB