2014-05-17 28 views
4

我試圖搜索SQL Server中的阿拉伯語文本,並需要忽略阿拉伯語變音符號。 所以我使用Arabic_100_CI_AI排序規則。但它不起作用。執行字符串comaparison忽略的變音符

例如對於下面的查詢我必須得到1,但它沒有結果!

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

這是什麼問題,我怎麼能執行變音符號不區分大小寫比較阿拉伯文文本

+0

真正唯一的區別是,第一個具有不同於第二個阿拉伯語變音符號和我想到的是那些相等使用不符號變音不敏感整理! – ARZ

回答

1

您對排序規則的使用是正確的,但是如果您仔細查看查詢中的兩個阿拉伯詞(突出顯示爲粗體),即使它們含義相同,因此您沒有得到結果(因爲比較失敗),它們是完全不同的

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

我敢肯定,如果你嘗試找出使用unicode()函數的Unicode值;他們的結果會有所不同。

如果您嘗試以下查詢,它會成功

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

看到這個職位的一個更好的解釋 Treating certain Arabic characters as identical

+0

你的查詢是成功的任何字符串!在我的例子中,字符串之間真正的區別在於,第一個字符與第二個字符不同,我希望那些使用不符號的對照整理是相同的! – ARZ

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