Em árabe, temos caracteres como ا (alef) e أ (alef com hamza).
Os usuários os escrevem de forma intercambiável e queremos pesquisá-los de forma intercambiável. O SQL Server os trata como caracteres separados. Como posso fazer o SQL tratá-los como o mesmo caractere?
Pensei em substituir qualquer أ (alef com hamza) por ا (alef) na inserção, mas temos muitas alternativas no idioma árabe, não apenas ا (alef) e أ (alef com hamza).
Eu tentei Arabic_CI_AS
e Arabic_CI_AI
mas isso não resolve o problema.
Aqui está um script para regenerar o problema:
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'ا%';
O resultado é:
ArabicChars
احمد
(1 row(s) affected)
O resultado desejado seria as duas linhas que inserimos.
sql-server
collation
George Botros
fonte
fonte
ا and أ
Respostas:
Eu fiz alguns testes e acho que é uma solução alternativa, mas pode fazer seu trabalho, já que o SQL não ajuda muito.
se você perceber que os unicodes desses caracteres estão próximos um do outro
então, entre أ e ا, é de 1571 a 1575 ou se você quiser ter certeza de que tudo fica entre
certifique-se de incluir de 1569 a 1575
que são
Portanto, para incluir tudo semelhante em sua pesquisa, você pode usar expressões regulares
portanto, nesse caso, você obtém todos os caracteres entre ء e ا, que incluem todos aqueles entre 1569 e 1575
Portanto, neste caso, se sua mesa tiver
a consulta acima irá obter todos eles.
mas você notará algo engraçado
se você tiver sua coluna como chave primária
você não poderá inserir esses 2 registros
porque ء, أ, إ são todos para SQL fazem parte do hamza que é ء
Então, se você executar a consulta
isso vai te mostrar
Então, para resumir a longa história
para SQL ã não é = para ا porque são 2 letras diferentes hamza e alefp
mas ء = آ = أ = ؤ = إ = ئ
eles são todos Hamza ء
fonte
esse é um dos problemas mais complicados pelos quais passei
então eu vou escrever tudo o que eu tentei que não funcionou, pode ser que você possa começar depois disso
Eu criei sua coluna usando COLLATE Arabic_CI_AI em que CI = insensível a maiúsculas e minúsculas e AI = insensível a sotaque, e é aqui que deve funcionar porque se você escolher outro idioma como, por exemplo, S e Š, ele funcionará
Eu também tentei alterar o agrupamento do banco de dados para Arabic_CI_AI ainda não funcionou
você também pode agrupar o script como
SELECT * FROM TestTable WHERE ArabicChars COLLATE Arabic_CI_AI como 'ا%' COLLATE Arabic_CI_AI;
e ainda não funcionou
confira este artigo que fala sobre o mesmo problema, mas do ponto de classificação
http://technet.microsoft.com/en-us/library/cc295829(SQL.90).aspx
isso é retirado do artigo
aqui está outra pessoa que pesquisou esse problema, mas não conseguiu encontrar nenhuma solução http://www.siao2.com/2008/11/11/9056745.aspx
tentando ignorar diacríticos ou hamza eu acho que não é possível no servidor sql atualmente
podem ser versões futuras
fonte
Para os fins mencionados neste post, você pode usar apenas: SQL_Latin1_General_CP1251_CI_AS [funciona para conjuntos de caracteres em árabe e persa e em inglês / latim].
fonte