Geo*_*ros 10 sql-server collation
在阿拉伯语中,我们有这样的字符?(alef) 和 ? (alef 与 hamza)。
用户可以互换地编写它们,我们希望可以互换地搜索它们。SQL Server 将它们视为单独的字符。如何让 SQL 将它们视为相同的字符?
我想更换任何?(alef 与 hamza)与 ? (alef) 在插入时,但我们有很多阿拉伯语的替代品,不仅仅是 ? (alef) 和 ? (alef 与 hamza)。
我试过了Arabic_CI_AS
,Arabic_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)
所需的结果将是我们插入的两行。
我做了一些测试,我想这是一个解决办法,但可以完成你的工作,因为 SQL 本身并没有多大帮助。
\n\n如果您发现这些字符的 unicode 彼此接近
\n\nselect 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\nSelect 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\nSELECT * \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\nCREATE 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\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');\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\nSELECT * \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 次 |
最近记录: |