Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak naprawić odwrócone znaki arabskie zmieszane z angielskim w serwerze SQL?

Problem polega na tym, że w bazie danych znajduje się pewna liczba ciągów, które są przechowywane w porządku nieleksykalnym. Prawdopodobnie pochodzą z aplikacji opartej na terminalu znakowym, która może przechowywać tylko znaki w kolejności od lewej do prawej.

Możesz wymusić na zgodnych aplikacjach wyświetlanie arabskiego od lewej do prawej, używając specjalnego znaku Unicode LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Wymusza to renderowanie wszystkich znaków od lewej do prawej, niezależnie od tego, jak normalnie byłyby renderowane.

Efekt kończy się na końcu ciągu lub na znaku PDF U+202C POP DIRECTIONAL FORMATTING .

W twoim przypadku wszystko, co musisz zrobić, to umieścić znak LRO na początku każdego ciągu, którego dotyczy problem:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Liczba 8237 dziesiętny odpowiednik szesnastkowego 202D .

Jeśli możesz łączyć te ciągi z innymi ciągami, które są prawidłowo przechowywane, powinieneś również użyć znaku PDF na końcu:

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

To informuje silnik renderujący tekst, że wymuszona sekwencja od lewej do prawej dobiegła końca.

Więcej informacji znajdziesz tutaj:

Uwagi:

  • Łączące się znaki nie będą się łączyć prawidłowo
  • Oprogramowanie do zamiany tekstu na mowę nie będzie działać – prawdopodobnie odczyta je alfabetycznie, ale nie jestem pewien.

Dalsze informacje

Znaki należy przechowywać w kolejności, w jakiej są pisane lub czytane, a nie w kolejności, w jakiej są wyświetlane. Na przykład ciąg:

test اختبار test

powinny być przechowywane jako

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

Zwróć uwagę, że najbardziej lewy wyświetlany znak arabski jest przechowywany na pozycji 12 (substring(@var, 12, 1) ), a wyświetlany po prawej stronie znajduje się na pozycji 7 (substring(@var, 7, 1) ). Jeśli po prostu policzysz znaki pozycji, tak jak są one wyświetlane od lewej do prawej, część arabska jest odwrócona w porównaniu do tego, jak jest przechowywana. Ale to dlatego, że ta część powinna być czytana od prawej do lewej, dlatego jest wyświetlana od prawej do lewej.

Aby rozwiązać problem, musisz najpierw sprawdzić:Czy ciągi są przechowywane nieprawidłowo CZY są przechowywane prawidłowo, ale wyświetlane nieprawidłowo?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaimplementować asocjacje polimorficzne w istniejącej bazie danych

  2. Jak wstawić dane do SQL Server

  3. Jak przekonwertować varchar na datę tylko wtedy, gdy zawiera poprawną datę?

  4. Unikanie zakleszczeń SQL dzięki dostrajaniu zapytań:porady Brenta Ozara

  5. Obejście problemu zdalnego wywoływania funkcji z wartościami przechowywanymi w tabeli w SQL Server ma jeszcze więcej problemów