Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como corrigir caracteres arábicos invertidos misturados com inglês no SQL Server


O problema é que você tem várias strings no banco de dados que são, por motivos legados, armazenadas em ordem não lexical. Provavelmente eles vieram de um aplicativo baseado em terminal de caracteres que só pode armazenar caracteres na ordem da esquerda para a direita.

Você pode forçar aplicativos compatíveis a exibir árabe da esquerda para a direita usando o caractere Unicode especial LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Isso força todos os caracteres a serem renderizados da esquerda para a direita, independentemente de como normalmente seriam renderizados.

O efeito termina no final da string ou no caractere PDF U+202C POP DIRECTIONAL FORMATTING .

No seu caso, tudo o que você precisa fazer é colocar o caractere LRO no início de cada string afetada:
select nchar(8237) + columnName as columnNameDisplay
from BadTable 

O número 8237 é o equivalente decimal do hexadecimal 202D .

Se você estiver concatenando essas strings com outras strings armazenadas corretamente, você também deve usar o caractere PDF no final:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable 

Isso informa ao mecanismo de renderização de texto que a sequência forçada da esquerda para a direita chegou ao fim.

Para mais informações, veja aqui:

Notas:
  • Os caracteres combinados não serão combinados corretamente
  • O software de conversão de texto em fala não funcionará - provavelmente o lerá em ordem alfabética, mas não tenho certeza.

Mais informações

Os caracteres devem ser armazenados na ordem em que são escritos ou lidos, não na ordem em que são exibidos. Assim, por exemplo, a string:
test اختبار test

deve ser armazenado 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 o caractere árabe mais à esquerda exibido é armazenado na posição 12 (substring(@var, 12, 1) ), e o mais à direita, conforme exibido, está na posição 7 (substring(@var, 7, 1) ). Se você simplesmente contar os caracteres de posição conforme eles são exibidos da esquerda para a direita, a parte árabe aparece invertida em comparação com a forma como está armazenada. Mas isso é porque essa parte deve ser lida da direita para a esquerda, portanto, é exibida da direita para a esquerda.

Para corrigir seu problema, primeiro você precisa verificar:As strings estão armazenadas incorretamente OU estão armazenadas corretamente, mas exibidas incorretamente?