Problemet är att du har ett antal strängar i databasen som, av äldre skäl, lagras i icke-lexikal ordning. Förmodligen kom de från en teckenterminalbaserad applikation som bara kan lagra tecken i vänster-till-höger-ordning.
Du kan tvinga kompatibla applikationer att visa arabiska från vänster till höger genom att använda det speciella Unicode-tecknet LRO U+202D: LEFT-TO-RIGHT OVERRIDE
. Detta tvingar alla karaktärer att renderas från vänster till höger oavsett hur de normalt skulle renderas.
Effekten slutar i slutet av strängen eller vid tecknet PDF U+202C POP DIRECTIONAL FORMATTING
.
I ditt fall är allt du behöver göra att sätta LRO-tecknet i början av varje påverkad sträng:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
Siffran 8237 är decimalmotsvarigheten till hexadecimal 202D
.
Om du kanske sammanfogar dessa strängar med andra strängar som lagras korrekt, bör du också använda PDF-tecknet i slutet:
select nchar(8237) + columnName + nchar(8236) as columnNameDisplay
from BadTable
Detta talar om för textåtergivningsmotorn att den påtvingade vänster-till-höger-sekvensen har tagit slut.
För mer information se här:
Anmärkningar:
- Tecknen som kombineras kommer inte att kombineras korrekt
- Text-till-tal-programvara fungerar inte - den kommer förmodligen att läsa den i alfabetisk ordning men jag är inte säker.
Ytterligare information
Tecken ska lagras i den ordning de skrivs eller läses, inte i den ordning de visas. Så till exempel, strängen:
test اختبار test
ska lagras som
01 t
02 e
03 s
04 t
05
07 ا
خ 08
09 ت
10 ب
11 ا
12 ر
13
14 t
15 e
16 s
17 t
Observera att det arabiska tecknet längst till vänster som visas lagras på position 12 (substring(@var, 12, 1)
), och den som visas längst till höger är på position 7 (substring(@var, 7, 1)
). Om du helt enkelt räknar positionstecken som de visas från vänster till höger, visas den arabiska delen omvänd jämfört med hur den är lagrad. Men det beror på att den delen är tänkt att läsas från höger till vänster, därför visas den från höger till vänster.
För att åtgärda ditt problem måste du först kontrollera:Är strängarna lagrade felaktigt ELLER är de lagrade korrekt men visas felaktigt?