执行字符串比较,忽略变音符号

时间:2014-05-17 13:21:42

标签: sql sql-server arabic collation

我正在尝试在SQL Server中搜索阿拉伯语文本,并且需要忽略阿拉伯语变音符号。 所以我正在使用Arabic_100_CI_AI整理。但它不起作用。

例如,对于以下查询,我必须得到1,但它没有结果!

select 1 
 where (N'مُحَمَّد'  Collate Arabic_100_CI_AI) = (N'محمّد' Collate Arabic_100_CI_AI)

问题是什么?如何在阿拉伯语文本中执行变音符号不敏感比较?

2 个答案:

答案 0 :(得分:3)

似乎AI标志不适用于阿拉伯语。您可以构建自己的Unicode规范化函数。

ALTER FUNCTION [dbo].[NormalizeUnicode] 
(
    -- Add the parameters for the function here
    @unicodeWord nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result nvarchar(max)

    -- Add the T-SQL statements to compute the return value here    
    declare @l int;
    declare @i int;

    SET @l = len(@unicodeWord + '-') - 1
    SET @i = 1;
    SET @Result = '';
    WHILE (@i <= @l)
    BEGIN
        DECLARE @c nvarchar(1);
        SET @c = SUBSTRING(@unicodeWord, @i, 1);
        -- 0x064B to 0x65F, 0x0670 are Combining Characters
        -- You may need to perform tests for this character range
        IF NOT (unicode(@c) BETWEEN 0x064B AND 0x065F or unicode(@c) = 0x0670)
            SET @Result = @Result + @c;
        SET @i = @i + 1;
    END

    -- Return the result of the function
    RETURN @Result
END

以下测试应该可以正常工作,

select  1
where   dbo.NormalizeUnicode(N'بِسمِ اللہِ الرَّحمٰنِ الرَّحیم') = dbo.NormalizeUnicode(N'بسم اللہ الرحمن الرحیم');

备注:

  1. 使用此解决方案可能会降低性能
  2. 我在该功能中使用的字符范围未经过全面测试。
  3. 有关阿拉伯语Unicode字符集的完整参考,请参阅此文档http://www.unicode.org/charts/PDF/U0600.pdf

答案 1 :(得分:1)

您对排序规则的使用是正确的,但如果您仔细查看查询中的两个阿拉伯语单词(突出显示为粗体),即使它们的含义相同,因此您完全不同,因此您没有得到结果(因为比较失败)

N'محمد'N'محمد'

我很确定,如果你试图使用unicode()函数找出他们的unicode值;他们的结果会有所不同。

如果您尝试以下查询,则会成功

select 1 
 where N'مُحَمَّد'  Collate Arabic_100_CI_AI like '%%'

有关更好的解释,请参阅此帖子 Treating certain Arabic characters as identical