Проблемът е, че имате редица низове в базата данни, които поради наследени причини се съхраняват в нелексикален ред. Вероятно идват от приложение, базирано на символен терминал, което може да съхранява знаци само в ред отляво надясно.
Можете да принудите съвместимите приложения да показват арабски отляво надясно, като използвате специалния Unicode символ LRO U+202D: LEFT-TO-RIGHT OVERRIDE
. Това принуждава всички символи да се изобразяват отляво надясно, независимо от начина, по който обикновено биха били изобразени.
Ефектът завършва в края на низа или на знака PDF U+202C POP DIRECTIONAL FORMATTING
.
Във вашия случай всичко, което трябва да направите, е да поставите знака LRO в началото на всеки засегнат низ:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
Числото 8237 е десетичният еквивалент на шестнадесетичен 202D
.
Ако може да свързвате тези низове с други низове, които се съхраняват правилно, трябва също да използвате символа PDF в края:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
Това казва на механизма за изобразяване на текст, че принудителната последователност отляво надясно е приключила.
За повече информация вижте тук:
Бележки:
- Комбинираните знаци няма да се комбинират правилно
- Софтуерът за синтезиран говор няма да работи - вероятно ще го прочете по азбучен ред, но не съм сигурен.
Допълнителна информация
Знаците трябва да се съхраняват в реда, в който са написани или прочетени, а не в реда, в който са показани. Така например, низът:
test اختبار test
трябва да се съхранява като
01 t
02 e
03 s
04 t
05
07 ا
خ 08
09 ت
10 ب
11 ا
12 ر
13
14 t
15 e
16 s
17 t
Забележете, че най-левият арабски знак, както се показва, се съхранява на позиция 12 (substring(@var, 12, 1)
), а най-десният, както се показва, е на позиция 7 (substring(@var, 7, 1)
). Ако просто преброите знаците за позициите, докато се показват отляво надясно, арабската част изглежда обърната в сравнение с начина, по който се съхранява. Но това е така, защото тази част трябва да се чете отдясно наляво, следователно се показва отдясно наляво.
За да коригирате проблема си, първо трябва да проверите:Дали низовете се съхраняват погрешно ИЛИ се съхраняват правилно, но се показват погрешно?