sql >> Database >  >> RDS >> Sqlserver

Hoe omgekeerde Arabische karakters gemengd met Engels in SQL-server te repareren?

Het probleem is dat je een aantal strings in de database hebt die om legacy-redenen in niet-lexicale volgorde zijn opgeslagen. Waarschijnlijk kwamen ze van een op tekenterminals gebaseerde applicatie die alleen tekens in de volgorde van links naar rechts kan opslaan.

U kunt compatibele toepassingen dwingen om Arabisch van links naar rechts weer te geven met behulp van het speciale Unicode-teken LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Dit dwingt alle karakters om van links naar rechts te worden weergegeven, ongeacht hoe ze normaal zouden worden weergegeven.

Het effect eindigt aan het einde van de tekenreeks of bij het teken PDF U+202C POP DIRECTIONAL FORMATTING .

In jouw geval hoef je alleen maar het LRO-teken aan het begin van elke betrokken string te plaatsen:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Het getal 8237 het decimale equivalent van hexadecimaal 202D .

Als u deze tekenreeksen aaneenvoegt met andere tekenreeksen die correct zijn opgeslagen, moet u ook het PDF-teken aan het einde gebruiken:

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

Dit vertelt de tekstweergave-engine dat de gedwongen volgorde van links naar rechts is beëindigd.

Voor meer informatie zie hier:

Opmerkingen:

  • Het combineren van tekens zal niet goed worden gecombineerd
  • Tekst-naar-spraak-software zal niet werken - het zal het waarschijnlijk alfabetisch lezen, maar ik weet het niet zeker.

Meer informatie

Tekens moeten worden opgeslagen in de volgorde waarin ze zijn geschreven of gelezen, niet in de volgorde waarin ze worden weergegeven. Dus bijvoorbeeld de string:

test اختبار test

moet worden opgeslagen als

01  t
02  e
03  s
04  t
05   
07  ا
خ  08  
09  ت
10  ب  
11  ا
12  ر
13 
14  t
15  e
16  s
17  t

Merk op dat het meest linkse Arabische teken zoals weergegeven wordt opgeslagen op positie 12 (substring(@var, 12, 1) ), en de meest rechtse zoals weergegeven is op positie 7 (substring(@var, 7, 1) ). Als u gewoon de positietekens telt zoals ze van links naar rechts worden weergegeven, wordt het Arabische gedeelte omgekeerd weergegeven in vergelijking met hoe het is opgeslagen. Maar dat komt omdat dat gedeelte van rechts naar links gelezen moet worden, daarom wordt het van rechts naar links weergegeven.

Om uw probleem op te lossen, moet u eerst controleren:zijn de tekenreeksen verkeerd opgeslagen OF zijn ze correct opgeslagen maar verkeerd weergegeven?



  1. Bedenk een primaire sleutelfout op postgresql, heroku, Rails 4

  2. hoe de java UUID terug te krijgen die in DB is opgeslagen als binair

  3. R RMySQL-query vervormt Japanse tekens

  4. ActiveRecord::StatementInvalid:PG::Error:ERROR:kan UPDATE niet uitvoeren in een alleen-lezen transactiefout in Heroku