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

Sql 忽略变音符号执行字符串比较,sql,sql-server,arabic,collation,Sql,Sql Server,Arabic,Collation,我正在尝试在SQL Server中搜索阿拉伯语文本,需要忽略阿拉伯语的发音符号。 所以我使用的是阿拉伯文100_CI_AI排序。但这不是工作 例如,对于下面的查询,我必须得到1,但它没有结果 select 1 where (N'مُحَمَّد' Collate Arabic_100_CI_AI) = (N'محمّد' Collate Arabic_100_CI_AI) 问题是什么?我如何在阿拉伯文文本中执行不区分重音的比较?您使用的排序规则是正确的,但是如果您仔细查看查询中的两个阿拉

我正在尝试在SQL Server中搜索阿拉伯语文本,需要忽略阿拉伯语的发音符号。 所以我使用的是
阿拉伯文100_CI_AI
排序。但这不是工作

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

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

问题是什么?我如何在阿拉伯文文本中执行不区分重音的比较?

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

N'strong>N'strong>N'strong>N'strong>

我敢肯定,如果您尝试使用
unicode()
函数来找出它们的unicode值,它们的结果会有所不同

如果您尝试下面的查询,它将成功

select 1 
 where N'مُحَمَّد'  Collate Arabic_100_CI_AI like '%%'
请参阅本文以获得更好的解释
似乎
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
注意事项:

  • 使用此解决方案时,您可能会遇到性能缓慢的问题
  • 我在函数中使用的字符范围没有经过彻底测试
  • 有关阿拉伯语Unicode字符集的完整参考,请参阅本文档

  • 对于任何字符串,您的查询都是成功的!在我的示例中,to字符串之间的唯一区别是,第一个字符串与第二个字符串不同,并且我希望使用不区分重音的排序规则时,它们是相等的!在我的示例中,to字符串之间的唯一区别是第一个字符串与第二个字符串不同,具有阿拉伯语重音第二个和我期望这些是平等的使用变音不敏感排序!
    select  1
    where   dbo.NormalizeUnicode(N'بِسمِ اللہِ الرَّحمٰنِ الرَّحیم') = dbo.NormalizeUnicode(N'بسم اللہ الرحمن الرحیم');