2016-03-10 10 views
5

मैं दो अक्षरों के बराबर ASCII कोड प्राप्त करने के लिए ASCII समारोह का उपयोग कर रहा है, लेकिन मैं हैरान हूँ देखकर जब वहाँ 'ي' और 'के बीच कोई अंतर नहीं है ی ', क्या कोई मेरी मदद कर सकता है?एसक्यूएल सर्वर 'ی' के बीच और Arabic_CI_AS मिलान में 'ي' अंतर नहीं

SELECT ASCII('ي'), ASCII('ی') 
+1

यह मेरा सवाल भी – Behzad

+0

जिस तरह से आप btw का चयन कर रहे है , पहले चरित्र के ASCII मूल्य प्राप्त करता है। वे पात्र निश्चित रूप से [ASCII कोड पृष्ठ] (https://en.wikipedia.org/wiki/ASCII) में नहीं हैं। यह एक अमेरिकी मानक है और इसमें बहुत कम प्रतीकों हैं। अरबी प्रतीकों का हिस्सा नहीं हैं। –

उत्तर

5

क्योंकि अपने चरित्र गैर यूनिकोड है आप ASCII() के बजाय UNICODE() समारोह का उपयोग करने के लिए है।

SELECT ASCII('ي'), ASCII('ی') 

परिणाम होगा: 237, 237

लेकिन

SELECT UNICODE(N'ي'), UNICODE(N'ی') 

परिणाम होगा: 1610, 1740

+1

बहुत बहुत धन्यवाद! –

+1

यह इसी रूप में काम नहीं करता है - आप दोनों के लिए लौट आए "63" मिलता है।आपको अपने स्ट्रिंग अक्षर को 'एन' उपसर्ग के साथ यूनिकोड के रूप में चिह्नित करने की आवश्यकता है - मैं इसे आपके लिए संपादित कर दूंगा, अगर आपको लगता है कि मैं गलत हूं तो रोलबैक के लिए स्वतंत्र महसूस करें। – Bridge

+0

@ ब्रिज आपका संपादन सही है। धन्यवाद – Behzad

2

यह एक सीमा ASCII कार्य है। documentation, ASCII के अनुसार:

एक चरित्र अभिव्यक्ति की वाम-पंथी चरित्र के ASCII कोड मान देता है।

हालांकि, आपके प्रश्न के पात्र एक से अधिक बाइट से बने हैं। ऐसा लगता है कि ASCII केवल एक बाइट पढ़ सकते हैं।

जब आप N उपसर्ग के बिना स्ट्रिंग शाब्दिक रूप में इन वर्णों का उपयोग, वे सिंगल-बाइट वर्ण माना जाता है। निम्न क्वेरी से पता चलता है कि एसक्यूएल सर्वर जब वे ठीक से मल्टी-बाइट के रूप में चिह्नित कर रहे हैं Arabic_CI_AS मिलान में बराबर के रूप में इन पात्रों का इलाज नहीं करता है:

:

SELECT CASE WHEN 'ي' COLLATE Arabic_CI_AS <> 'ی' COLLATE Arabic_CI_AS 
THEN 1 ELSE 0 END AS are_different_ascii, 
CASE WHEN N'ي' COLLATE Arabic_CI_AS <> N'ی' COLLATE Arabic_CI_AS 
THEN 1 ELSE 0 END AS are_different_unicode 

निम्न क्वेरी बाइट्स कि पात्रों को बनाने से पता चलता

SELECT CAST(N'ي' COLLATE Arabic_CI_AS as varbinary(4)), 
CAST(N'ی' COLLATE Arabic_CI_AS as varbinary(4)), 
CAST('ي' COLLATE Arabic_CI_AS as varbinary(4)), 
CAST('ی' COLLATE Arabic_CI_AS as varbinary(4)) 

हालांकि, यहां तक ​​कि जब आप यूनिकोड के रूप में वर्ण निशान, ASCII समारोह में एक ही मान देता है क्योंकि यह केवल एक बाइट पढ़ सकते हैं:

SELECT ASCII(N'ي' COLLATE Arabic_CI_AS) , ASCII(N'ی' COLLATE Arabic_CI_AS) 

संपादित टीटी के रूप में। बताते हैं, इन पात्रों ASCII कोड तालिका में एक प्रविष्टि नहीं है।

4

इस

SELECT UNICODE(N'ي'), UNICODE(N'ی') 
प्रयास करें
3

मामले में उचित कोलेट का उपयोग करके एक अन्य समाधान आप Ascii उपयोग करने के लिए

Arabic_CS_AS_KS 

परिणाम के रूप में ى = 236 आ जाएगा चाहते हैं और ي = 237

संबंधित मुद्दे