0

在我的 sql 服务器中:

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

产生1. 我也可以在这里重现。谁能向我解释为什么?

4

3 回答 3

2

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

如果您只需要测试字符串的(二进制)相等性,忽略每个排序顺序,请使用 Latin1_General_BIN 排序规则(或以 _BIN 或 _BIN2 结尾的任何其他排序规则):

select case 
    when N'ܐܪܡܝܐ' COLLATE Latin1_General_BIN = N'አማርኛ' COLLATE Latin1_General_BIN 
    then 1 else 0 end
于 2013-05-26T19:07:21.757 回答
1

评论太长了,所以我添加了另一个答案,指的是@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 值表示。

于 2013-06-03T12:25:40.120 回答
0

如果我运行它,它们都会返回 63。

select ascii('ܐ') AA, ascii('አ') AB
于 2013-05-26T20:27:09.803 回答