sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir caracteres árabes invertidos mezclados con inglés en el servidor SQL

El problema es que tiene una serie de cadenas en la base de datos que, por razones heredadas, se almacenan en un orden no léxico. Probablemente provengan de una aplicación basada en terminal de caracteres que solo puede almacenar caracteres en orden de izquierda a derecha.

Puede obligar a las aplicaciones compatibles a mostrar árabe de izquierda a derecha utilizando el carácter especial Unicode LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Esto obliga a que todos los caracteres se representen de izquierda a derecha, independientemente de cómo se representarían normalmente.

El efecto finaliza al final de la cadena o en el carácter PDF U+202C POP DIRECTIONAL FORMATTING .

En su caso, todo lo que necesita hacer es colocar el carácter LRO al comienzo de cada cadena afectada:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

El número 8237 el equivalente decimal del hexadecimal 202D .

Si pudiera estar concatenando estas cadenas con otras cadenas que están almacenadas correctamente, también debe usar el carácter PDF al final:

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

Esto le dice al motor de representación de texto que la secuencia forzada de izquierda a derecha ha llegado a su fin.

Para obtener más información, consulte aquí:

Notas:

  • Los caracteres combinados no se combinarán correctamente
  • El software de conversión de texto a voz no funcionará; probablemente lo leerá en orden alfabético, pero no estoy seguro.

Más información

Los caracteres deben almacenarse en el orden en que se escriben o leen, no en el orden en que se muestran. Entonces, por ejemplo, la cadena:

test اختبار test

debe almacenarse como

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

Observe que el carácter árabe más a la izquierda que se muestra se almacena en la posición 12 (substring(@var, 12, 1) ), y el más a la derecha como se muestra está en la posición 7 (substring(@var, 7, 1) ). Si simplemente cuenta los caracteres de posición a medida que se muestran de izquierda a derecha, la parte árabe aparece invertida en comparación con la forma en que se almacena. Pero eso se debe a que se supone que esa parte debe leerse de derecha a izquierda, por lo tanto, se muestra de derecha a izquierda.

Para solucionar su problema, primero debe verificar:¿Las cadenas están almacenadas incorrectamente O están almacenadas correctamente pero se muestran incorrectamente?