我正在使用ASCII函数获取两个字符的等效ASCII码,但是当看到“ي”和“ی”之间没有区别时我很惊讶,有人可以帮助我吗?
SELECT ASCII('ي'), ASCII('ی')
答案 0 :(得分:4)
由于您的字符是非Unicode,因此您必须使用UNICODE()
函数而不是ASCII()
。
SELECT ASCII('ي'), ASCII('ی')
将导致:237
,237
但是
SELECT UNICODE(N'ي'), UNICODE(N'ی')
将导致:1610
,1740
答案 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码表中没有条目。