Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да коригирам обърнати арабски знаци, смесени с английски в SQL сървър

Проблемът е, че имате редица низове в базата данни, които поради наследени причини се съхраняват в нелексикален ред. Вероятно идват от приложение, базирано на символен терминал, което може да съхранява знаци само в ред отляво надясно.

Можете да принудите съвместимите приложения да показват арабски отляво надясно, като използвате специалния Unicode символ LRO U+202D: LEFT-TO-RIGHT OVERRIDE . Това принуждава всички символи да се изобразяват отляво надясно, независимо от начина, по който обикновено биха били изобразени.

Ефектът завършва в края на низа или на знака PDF U+202C POP DIRECTIONAL FORMATTING .

Във вашия случай всичко, което трябва да направите, е да поставите знака LRO в началото на всеки засегнат низ:

select nchar(8237) + columnName as columnNameDisplay
from BadTable 

Числото 8237 е десетичният еквивалент на шестнадесетичен 202D .

Ако може да свързвате тези низове с други низове, които се съхраняват правилно, трябва също да използвате символа PDF в края:

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

Това казва на механизма за изобразяване на текст, че принудителната последователност отляво надясно е приключила.

За повече информация вижте тук:

Бележки:

  • Комбинираните знаци няма да се комбинират правилно
  • Софтуерът за синтезиран говор няма да работи - вероятно ще го прочете по азбучен ред, но не съм сигурен.

Допълнителна информация

Знаците трябва да се съхраняват в реда, в който са написани или прочетени, а не в реда, в който са показани. Така например, низът:

test اختبار test

трябва да се съхранява като

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

Забележете, че най-левият арабски знак, както се показва, се съхранява на позиция 12 (substring(@var, 12, 1) ), а най-десният, както се показва, е на позиция 7 (substring(@var, 7, 1) ). Ако просто преброите знаците за позициите, докато се показват отляво надясно, арабската част изглежда обърната в сравнение с начина, по който се съхранява. Но това е така, защото тази част трябва да се чете отдясно наляво, следователно се показва отдясно наляво.

За да коригирате проблема си, първо трябва да проверите:Дали низовете се съхраняват погрешно ИЛИ се съхраняват правилно, но се показват погрешно?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Клауза WHERE за тип данни на SQL Server Text

  2. Как проактивно да събираме информация за фрагментиране на индекси на SQL Server

  3. CRUD работа с ASP.NET Core MVC, Entity Framework Core и SQL Server

  4. Порт 1433 на защитната стена не се отваря

  5. TSQL PIVOT МНОГО КОЛОНИ