समस्या यह है कि आपके पास डेटाबेस में कई तार हैं जो विरासत कारणों से गैर-व्याख्यात्मक क्रम में संग्रहीत हैं। संभवतः वे एक वर्ण टर्मिनल आधारित अनुप्रयोग से आए हैं जो केवल वर्णों को बाएँ से दाएँ क्रम में संग्रहीत कर सकता है।
आप संगत एप्लिकेशन को विशेष यूनिकोड वर्ण LRO U+202D: LEFT-TO-RIGHT OVERRIDE
का उपयोग करके अरबी बाएं से दाएं प्रदर्शित करने के लिए बाध्य कर सकते हैं। . यह सभी वर्णों को बाएँ से दाएँ रेंडर करने के लिए बाध्य करता है, भले ही उन्हें सामान्य रूप से कैसे प्रस्तुत किया जाए।
प्रभाव स्ट्रिंग के अंत में या वर्ण पर समाप्त होता है PDF U+202C POP DIRECTIONAL FORMATTING
।
आपके मामले में आपको बस इतना करना है कि प्रत्येक प्रभावित स्ट्रिंग की शुरुआत में LRO वर्ण डालें:
select nchar(8237) + columnName as columnNameDisplay
from BadTable
संख्या 8237 हेक्साडेसिमल के दशमलव समतुल्य 202D
।
यदि आप इन स्ट्रिंग्स को अन्य स्ट्रिंग्स के साथ जोड़ रहे हैं जो सही ढंग से संग्रहीत हैं, तो आपको अंत में पीडीएफ वर्ण का भी उपयोग करना चाहिए:
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)
पर है ) यदि आप केवल स्थिति वर्णों की गणना करते हैं जैसे वे बाएं से दाएं प्रदर्शित होते हैं, अरबी भाग इसे कैसे संग्रहीत किया जाता है, इसकी तुलना में उलट दिखाई देता है। लेकिन ऐसा इसलिए है क्योंकि उस हिस्से को दाएं से बाएं पढ़ा जाना चाहिए, इसलिए इसे दाएं से बाएं दिखाया जाता है।
अपनी समस्या को ठीक करने के लिए आपको पहले यह जांचना होगा:क्या तार गलत तरीके से संग्रहीत हैं या वे सही तरीके से संग्रहीत हैं लेकिन गलत तरीके से प्रदर्शित हैं?