En arabe, nous avons des caractères comme ا (alef) et أ (alef avec hamza).
Les utilisateurs les écrivent de manière interchangeable et nous voulons les rechercher de manière interchangeable. SQL Server les traite comme des caractères distincts. Comment puis-je faire en sorte que SQL les traite comme le même caractère?
J'ai pensé remplacer n'importe quel أ (alef avec hamza) par ا (alef) à l'insertion mais nous avons beaucoup d'alternatives en langue arabe non seulement ا (alef) et أ (alef avec hamza).
J'ai essayé Arabic_CI_AS
et Arabic_CI_AI
cela ne résout pas le problème.
Voici un script pour régénérer le problème:
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'ا%';
Le résultat est:
ArabicChars
احمد
(1 row(s) affected)
Le résultat souhaité serait les deux lignes que nous avons insérées.
sql-server
collation
George Botros
la source
la source
ا and أ
Réponses:
J'ai fait quelques tests et je suppose que c'est un travail à faire, mais je peux faire votre travail, car SQL lui-même n'aide pas beaucoup.
si vous remarquez que les unicodes de ces caractères sont proches les uns des autres
donc entre أ et ا, c'est de 1571 à 1575 ou si vous voulez vous assurer d'avoir tout entre les deux
assurez-vous d'inclure de 1569 à 1575
qui sont
Donc, pour vous assurer d'inclure tout ce qui est similaire dans votre recherche, vous pouvez utiliser des expressions régulières
dans ce cas, vous obtenez tous les caractères entre ء et ا qui incluent tous ceux entre 1569 et 1575
dans ce cas, si votre table a
la requête ci-dessus les obtiendra tous.
mais vous remarquerez quelque chose de drôle
si vous avez votre colonne comme clé primaire
vous ne pourrez pas insérer ces 2 enregistrements
parce que les ء, أ, إ sont tous en SQL font partie de hamza qui est ء
Donc, si vous exécutez la requête
ça vous montrera
donc pour faire court
à SQL أ n'est pas = à ا car ses 2 lettres différentes hamza et alefp
mais ء = آ = أ = ؤ = إ = ئ
ils sont tous Hamza ء
la source
c'est l'un des problèmes les plus compliqués que j'ai traversés
donc je vais vous écrire tout ce que j'ai essayé qui n'a pas fonctionné, peut-être que vous pouvez commencer après cela
j'ai créé votre colonne en utilisant COLLATE Arabic_CI_AI où CI = insensible à la casse et AI = insensible à l'accent, et c'est là que son suppose de fonctionner parce que si vous avez choisi une autre langue comme par exemple S et Š, cela fonctionne
j'ai également essayé de changer le classement de la base de données en Arabic_CI_AI ne fonctionnait toujours pas
vous pouvez également assembler le script comme
SELECT * FROM TestTable WHERE ArabicChars COLLATE Arabic_CI_AI comme 'ا%' COLLATE Arabic_CI_AI;
et ça n'a toujours pas marché
consultez cet article, il parle du même problème, mais du point de tri
http://technet.microsoft.com/en-us/library/cc295829(SQL.90).aspx
cela est tiré de l'article
voici une autre personne qui a recherché ce problème mais n'a trouvé aucune solution http://www.siao2.com/2008/11/11/9056745.aspx
essayer d'ignorer les signes diacritiques ou hamza je suppose que ce n'est pas possible dans le serveur sql actuellement
peut être des versions futures
la source
Aux fins mentionnées dans cet article, vous ne pouvez utiliser que: SQL_Latin1_General_CP1251_CI_AS [cela fonctionne pour l'arabe et le persan ainsi que pour les jeux de caractères anglais / latin].
la source