SQL Server在Arabic_CI_AS排序规则中'ی'和'ي'之间没有区别

时间:2016-03-10 11:05:18

标签: sql-server ascii arabic collation

我正在使用ASCII函数获取两个字符的等效ASCII码,但是当看到“ي”和“ی”之间没有区别时我很惊讶,有人可以帮助我吗?

SELECT ASCII('ي'), ASCII('ی')

4 个答案:

答案 0 :(得分:4)

由于您的字符是非Unicode,因此您必须使用UNICODE()函数而不是ASCII()

SELECT ASCII('ي'), ASCII('ی')

将导致:237237

但是

SELECT UNICODE(N'ي'), UNICODE(N'ی')

将导致:16101740

答案 1 :(得分:4)

试试这个

SELECT UNICODE(N'ي'), UNICODE(N'ی')

答案 2 :(得分:3)

使用正确的整理的另一种解决方案,以防您想使用Ascii

Arabic_CS_AS_KS

结果将为ى= 236和ي= 237

答案 3 :(得分:2)

这是限制ASCII功能。根据{{​​3}},ASCII

  

返回字符表达式最左边字符的ASCII代码值。

但是,问题中的字符由多个字节组成。似乎ASCII只能读取一个字节。

如果将这些字符用作不带N前缀的字符串文字,则将它们视为单字节字符。以下查询显示,当正确标记为多字节时,SQL Server不会将这些字符视为在Arabic_CI_AS排序规则中相等:

SELECT CASE WHEN 'ي' COLLATE Arabic_CI_AS <> 'ی' COLLATE Arabic_CI_AS
THEN 1 ELSE 0 END AS are_different_ascii,
CASE WHEN N'ي' COLLATE Arabic_CI_AS <> N'ی' COLLATE Arabic_CI_AS
THEN 1 ELSE 0 END AS are_different_unicode

以下查询显示组成字符的字节:

SELECT CAST(N'ي' COLLATE Arabic_CI_AS as varbinary(4)),
CAST(N'ی' COLLATE Arabic_CI_AS as varbinary(4)),
CAST('ي' COLLATE Arabic_CI_AS as varbinary(4)),
CAST('ی' COLLATE Arabic_CI_AS as varbinary(4))

但是,即使将字符标记为unicode,ASCII函数也会返回相同的值,因为它只能读取一个字节:

SELECT ASCII(N'ي' COLLATE Arabic_CI_AS) , ASCII(N'ی' COLLATE Arabic_CI_AS)

编辑作为TT。指出,这些角色在ASCII码表中没有条目。