Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment réparer les caractères arabes inversés mélangés à l'anglais dans le serveur SQL

Le problème est que vous avez un certain nombre de chaînes dans la base de données qui sont, pour des raisons héritées, stockées dans un ordre non lexical. Ils proviennent probablement d'une application basée sur un terminal de caractères qui ne peut stocker que des caractères dans l'ordre de gauche à droite.

Vous pouvez forcer les applications conformes à afficher l'arabe de gauche à droite en utilisant le caractère spécial Unicode LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Cela force tous les caractères à être rendus de gauche à droite, quelle que soit la façon dont ils seraient normalement rendus.

L'effet se termine à la fin de la chaîne ou au caractère PDF U+202C POP DIRECTIONAL FORMATTING .

Dans votre cas, tout ce que vous avez à faire est de mettre le caractère LRO au début de chaque chaîne affectée :

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Le nombre 8237 l'équivalent décimal de l'hexadécimal 202D .

Si vous concaténez ces chaînes avec d'autres chaînes correctement stockées, vous devez également utiliser le caractère PDF à la fin :

select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable 

Cela indique au moteur de rendu de texte que la séquence forcée de gauche à droite est terminée.

Pour plus d'informations, voir ici :

Remarques :

  • Les caractères combinés ne se combineront pas correctement
  • Le logiciel de synthèse vocale ne fonctionnera pas :il le lira probablement par ordre alphabétique, mais je n'en suis pas sûr.

Plus d'informations

Les caractères doivent être stockés dans l'ordre dans lequel ils sont écrits ou lus, et non dans l'ordre dans lequel ils sont affichés. Ainsi, par exemple, la chaîne :

test اختبار test

doit être stocké sous

01  t
02  e
03  s
04  t
05   
07  ا
خ  08  
09  ت
10  ب  
11  ا
12  ر
13 
14  t
15  e
16  s
17  t

Notez que le caractère arabe le plus à gauche tel qu'il est affiché est stocké à la position 12 (substring(@var, 12, 1) ), et la plus à droite telle qu'elle est affichée est à la position 7 (substring(@var, 7, 1) ). Si vous comptez simplement les caractères de position tels qu'ils sont affichés de gauche à droite, la partie arabe apparaît inversée par rapport à la façon dont elle est stockée. Mais c'est parce que cette partie est censée être lue de droite à gauche, donc elle est affichée de droite à gauche.

Pour résoudre votre problème, vous devez d'abord vérifier :les chaînes sont-elles stockées à tort OU sont-elles stockées correctement mais affichées à tort ?