sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan repareres omvendte arabiske tegn blandet med engelsk i SQL-server

Problemet er, at du har en række strenge i databasen, som af ældre årsager er gemt i ikke-leksikalsk rækkefølge. Sandsynligvis kom de fra en karakterterminalbaseret applikation, som kun kan gemme tegn i venstre-til-højre rækkefølge.

Du kan tvinge kompatible applikationer til at vise arabisk fra venstre mod højre ved at bruge det specielle Unicode-tegn LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Dette tvinger alle karakterer til at blive gengivet fra venstre mod højre, uanset hvordan de normalt ville blive gengivet.

Effekten slutter i slutningen af ​​strengen eller ved tegn PDF U+202C POP DIRECTIONAL FORMATTING .

I dit tilfælde skal du blot sætte LRO-tegnet i begyndelsen af ​​hver berørt streng:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Tallet 8237 er decimalækvivalenten til hexadecimal 202D .

Hvis du måske sammenkæder disse strenge med andre strenge, der er gemt korrekt, skal du også bruge PDF-tegnet i slutningen:

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

Dette fortæller tekstgengivelsesmaskinen, at den tvungne venstre-til-højre-sekvens er afsluttet.

For mere information se her:

Bemærkninger:

  • De kombinerede tegn kombineres ikke korrekt
  • Tekst-til-tale-software virker ikke - det vil sandsynligvis læse det alfabetisk, men jeg er ikke sikker.

Yderligere oplysninger

Tegn skal opbevares i den rækkefølge, de er skrevet eller læst, ikke i den rækkefølge, de vises. Så for eksempel strengen:

test اختبار test

skal gemmes 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

Bemærk, at det arabiske tegn længst til venstre, som det vises, er gemt på position 12 (substring(@var, 12, 1) ), og den længst til højre som vist er på position 7 (substring(@var, 7, 1) ). Hvis du blot tæller positionstegnene, som de vises fra venstre mod højre, vises den arabiske del omvendt i forhold til, hvordan den er gemt. Men det er fordi den del formodes at blive læst fra højre mod venstre, derfor vises den fra højre mod venstre.

For at løse dit problem skal du først tjekke:Er strengene gemt forkert ELLER er de gemt korrekt, men vises forkert?



  1. SQL-fejl:ORA-12899:værdi for stor til kolonne

  2. Hvorfor er visse typer forberedte forespørgsler ved hjælp af PDO i PHP med MySQL langsomme?

  3. Er der en måde i MySQL at implicit oprette en primær nøgle til en tabel?

  4. JOIN-problem:Ret SQL-sætningen, der skal løses:ORA-01799:en kolonne må ikke være udvendig forbundet med en underforespørgsel