Problém je v tom, že v databázi máte řadu řetězců, které jsou z důvodů dědictví uloženy v nelexikálním pořadí. Pravděpodobně pocházejí z aplikace založené na znakovém terminálu, která může ukládat znaky pouze v pořadí zleva doprava.
Kompatibilní aplikace můžete vynutit, aby zobrazovaly arabštinu zleva doprava pomocí speciálního znaku Unicode LRO U+202D: LEFT-TO-RIGHT OVERRIDE
. To přinutí všechny znaky, aby byly vykresleny zleva doprava bez ohledu na to, jak by byly normálně vykresleny.
Efekt končí na konci řetězce nebo na znaku PDF U+202C POP DIRECTIONAL FORMATTING
.
Ve vašem případě vše, co musíte udělat, je umístit znak LRO na začátek každého ovlivněného řetězce:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
Číslo 8237, což je dekadický ekvivalent šestnáctkové soustavy 202D
.
Pokud možná spojujete tyto řetězce s jinými řetězci, které jsou správně uloženy, měli byste také použít znak PDF na konci:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
To sděluje modulu vykreslování textu, že vynucená sekvence zleva doprava skončila.
Více informací naleznete zde:
Poznámky:
- Kombinované znaky se nebudou správně kombinovat
- Software pro převod textu na řeč nebude fungovat – pravděpodobně jej přečte podle abecedy, ale nejsem si jistý.
Další informace
Znaky by měly být uloženy v pořadí, v jakém jsou zapsány nebo čteny, nikoli v pořadí, v jakém jsou zobrazeny. Takže například řetězec:
test اختبار test
by měl být uložen 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
Všimněte si, že zobrazený arabský znak zcela vlevo je uložen na pozici 12 (substring(@var, 12, 1)
) a zobrazený úplně vpravo je na pozici 7 (substring(@var, 7, 1)
). Pokud jednoduše spočítáte znaky pozic tak, jak jsou zobrazeny zleva doprava, arabská část se zobrazí obráceně ve srovnání s tím, jak je uložena. Ale to je proto, že tato část se má číst zprava doleva, proto se zobrazuje zprava doleva.
Chcete-li problém vyřešit, musíte nejprve zkontrolovat:Jsou řetězce uloženy nesprávně NEBO jsou uloženy správně, ale zobrazují se nesprávně?