在我的 sql 服务器中:
select case when N'ܐܪܡܝܐ' = N'አማርኛ' then 1 else 0 end
产生1
. 我也可以在这里重现。谁能向我解释为什么?
特定的排序规则不需要包含以 Unicode 定义的每个代码点的排序信息。
如果您只需要测试字符串的(二进制)相等性,忽略每个排序顺序,请使用 Latin1_General_BIN 排序规则(或以 _BIN 或 _BIN2 结尾的任何其他排序规则):
select case
when N'ܐܪܡܝܐ' COLLATE Latin1_General_BIN = N'አማርኛ' COLLATE Latin1_General_BIN
then 1 else 0 end
评论太长了,所以我添加了另一个答案,指的是@JBrooks的答案:
如果你执行会发生什么
select ascii('ܐ') AA, ascii('አ') AB
首先,字符串文字,即 ASCII 范围之上的 Unicode 代码点,被转换为 '?' 因为它们没有被标记为 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 替换字符 U+FFFD的 ASCII 等价物,它本身不能用 ASCII 值表示。
如果我运行它,它们都会返回 63。
select ascii('ܐ') AA, ascii('አ') AB