sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man fixar omvända arabiska tecken blandat med engelska i SQL-server

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?



  1. Mysql-fråga för att extrahera domäner från webbadresser

  2. Vad är det bästa sättet att välja de två första posterna i varje grupp med ett SELECT-kommando?

  3. Logstash:Det går inte att ansluta till extern Amazon RDS-databas

  4. Problem med att komma åt MySQL från Java