将某些阿拉伯字符视为相同

Geo*_*ros 10 sql-server collation

在阿拉伯语中,我们有这样的字符?(alef) 和 ? (alef 与 hamza)。

用户可以互换地编写它们,我们希望可以互换地搜索它们。SQL Server 将它们视为单独的字符。如何让 SQL 将它们视为相同的字符?

我想更换任何?(alef 与 hamza)与 ? (alef) 在插入时,但我们有很多阿拉伯语的替代品,不仅仅是 ? (alef) 和 ? (alef 与 hamza)。

我试过了Arabic_CI_ASArabic_CI_AI但这并不能解决问题。

这是一个重新生成问题的脚本:

CREATE TABLE [dbo].[TestTable] (
    [ArabicChars] [nvarchar](50) NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];


INSERT INTO TestTable values (N'????');
INSERT INTO TestTable values (N'????');

SELECT * 
FROM TestTable 
WHERE ArabicChars like N'?%';
Run Code Online (Sandbox Code Playgroud)

结果是:

ArabicChars 

????

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

所需的结果将是我们插入的两行。

Amm*_*arR 5

我做了一些测试,我想这是一个解决办法,但可以完成你的工作,因为 SQL 本身并没有多大帮助。

\n\n

如果您发现这些字符的 unicode 彼此接近

\n\n
select unicode(N'\xd8\xa3')\n  = 1571\n\nselect unicode(N'\xd8\xa7')\n  = 1575\n\nselect unicode(N'\xd8\xa5')\n  = 1573\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以在 \xd8\xa3 和 \xd8\xa7 之间,它是从 1571 到 1575\nor 如果你想确保你得到之间的所有东西

\n\n

确保包含从 1569 到 1575

\n\n

哪个是

\n\n
Select NCHAR(1569) = \xd8\xa1\nSelect NCHAR(1570) = \xd8\xa2\nSelect NCHAR(1571) = \xd8\xa3\nSelect NCHAR(1572) = \xd8\xa4\nSelect NCHAR(1573) = \xd8\xa5\nSelect NCHAR(1574) = \xd8\xa6 \nSelect NCHAR(1575) = \xd8\xa7\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,为了确保在搜索中包含所有相似的内容,您可以使用正则表达式

\n\n
SELECT * \nFROM TestTable \nWHERE ArabicChars like '%[\xd8\xa1-\xd8\xa7]%'\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在这种情况下,您将获得 \xd8\xa1 和 \xd8\xa7\n 之间的所有字符,其中包括 1569 到 1575 之间的所有字符

\n\n

所以在这种情况下如果你的桌子有

\n\n
 CREATE TABLE [dbo].[TestTable]  (\n    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,\n) \nINSERT INTO TestTable values (N'\xd8\xa7\xd8\xad\xd9\x85\xd8\xaf');\nINSERT INTO TestTable values (N'\xd8\xa3\xd8\xad\xd9\x85\xd8\xaf');\nINSERT INTO TestTable values (N'\xd8\xa5\xd8\xad\xd9\x85\xd8\xaf');\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的查询将得到它们全部。

\n\n

但你会注意到一些有趣的事情

\n\n

如果您将列作为主键

\n\n
CREATE TABLE [dbo].[TestTable]  (\n    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,\n\n    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED \n    (\n       [ArabicChars] ASC\n    )\n) ON [PRIMARY];\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将无法插入这 2 条记录

\n\n
INSERT INTO TestTable values (N'\xd8\xa3\xd8\xad\xd9\x85\xd8\xaf');\nINSERT INTO TestTable values (N'\xd8\xa5\xd8\xad\xd9\x85\xd8\xaf');\nINSERT INTO TestTable values (N'\xd8\xa1\xd8\xad\xd9\x85\xd8\xaf');\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为 \xd8\xa1、\xd8\xa3、\xd8\xa5\n 都是 SQL 的 hamza 的一部分,即 \xd8\xa1

\n\n

所以如果你运行查询

\n\n
SELECT * \nFROM TestTable \nWHERE ArabicChars like '\xd8\xa1%'\n
Run Code Online (Sandbox Code Playgroud)\n\n

它会告诉你

\n\n
\xd8\xa3\xd8\xad\xd9\x85\xd8\xaf\n\xd8\xa5\xd8\xad\xd9\x85\xd8\xaf\n
Run Code Online (Sandbox Code Playgroud)\n\n

长话短说

\n\n

到 SQL \xd8\xa3 不是 = 到 \xd8\xa7,因为它有 2 个不同的字母\nhamza 和 alefp

\n\n

但 \xd8\xa1 = \xd8\xa2 = \xd8\xa3 = \xd8\xa4 = \xd8\xa5 = \xd8\xa6

\n\n

他们都是 Hamza \xd8\xa1

\n


归档时间:

查看次数:

9347 次

最近记录:

9 年,10 月 前