sql >> Databáze >  >> RDS >> Sqlserver

Jak opravit obrácené arabské znaky smíchané s angličtinou na serveru SQL

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ě?



  1. com.mysql.jdbc.PacketTooBigException

  2. Hlášení podrobněji než obvykle – Microsoft Access

  3. Jak vypnout mezipaměť dotazů MySQL při používání SQLAlchemy?

  4. Pokud databáze existuje, ukončete skript MySQL