我有一个sql server数据库,表列包含同一字段中的阿拉伯语和英语字符,就像Oracle اوراكل
寻求帮助将阿拉伯字符从英文字符中分离出来以反转它们。因为阿拉伯字符在字段中没有特定的位置,开始,结束或在字段中间。
编辑这些字符来自旧的IBM大型机应用程序,并以错误的顺序存储,即它们按照从左到右显示的顺序存储,而不是按顺序存储被阅读。
我们需要的是让它们在其他应用程序中正确显示。
答案 0 :(得分:2)
问题是数据库中有许多字符串,由于遗留原因,这些字符串以非词法顺序存储。可能它们来自基于字符终端的应用程序,它只能以从左到右的顺序存储字符。
您可以强制合规应用程序使用特殊的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 :(得分:0)
在oracle中,同样的解决方案就像:
for