Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

हाइफ़न वाले Oracle नियमित अभिव्यक्ति विंडोज़ पर यूनिक्स के समान परिणाम नहीं देते हैं

जैसा कि अविनाश राज ने टिप्पणियों में कहा, आपके नियमित अभिव्यक्ति पैटर्न में हाइफ़न की व्याख्या एक सीमा के रूप में की जा रही है। ऐसा लगता है कि व्यवहार NLS_LANG पर्यावरण चर के आधार पर दो क्लाइंट द्वारा उपयोग किए जा रहे सॉर्टिंग एल्गोरिदम पर निर्भर करता है, जो NLS_SORT मान को प्रभावित करता है।

NLS_LANG=ENGLISH_UNITED KINGDOM.WE8ISO8859P1 के साथ :

SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;

REG
------------
TEST      V

SQL> select value from nls_session_parameters where parameter = 'NLS_SORT';

VALUE
----------
BINARY

NLS_LANG="ARABIC_MOROCCO.AR8MSWIN1256" के साथ, जब आपकी प्रोफ़ाइल कहती है कि आप मोरक्को में हैं, तो एक हद तक बाहर जाना :

SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;

REG
------------
TEST 3304 V2

SQL> select value from nls_session_parameters where parameter = 'NLS_SORT';

VALUE
----------
ARABIC

इसका कारण यह है कि पैटर्न खंड +-= + . से सभी वर्णों को कवर करने वाली श्रेणी के रूप में माना जाता है करने के लिए = . ISO8859-1 और Windows 1252 वर्ण सेट में वह वर्ण 43 से 61 है, और सभी संख्यात्मक अंक उस सीमा के भीतर आते हैं - उदाहरण के लिए शून्य 48 है - उस सीमा के भीतर हैं, इसलिए रेगेक्स उन्हें बदल देता है। यह Windows 1256 कैरेक्टर सेट में भी सही है। . (और ASCII पर आधारित कुछ भी)।

लेकिन आपका NLS_LANG भी परोक्ष रूप से सॉर्ट क्रम को बदल रहा है, और यह BINARY से ARABIC सॉर्टिंग में स्विच करता है जो व्यवहार को बदलता है। आप इसे एक ही सत्र में देख सकते हैं; NLS_LANG=ENGLISH_UNITED KINGDOM.WE8ISO8859P1 के साथ :

SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;

REG
------------
TEST      V

SQL> alter session set NLS_SORT=ARABIC;

Session altered.

SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-={}|;.:<>?,./]', ' ') as REG from dual;

REG
------------
TEST 3304 V2

आप यह भी बता सकते हैं कि यह सीमा को थोड़ा संशोधित करके एक सीमा मुद्दा है; +-= बदल रहा है करने के लिए +-3 इसलिए उच्च अंक शामिल नहीं हैं, लेकिन बाकी सब कुछ वही छोड़ रहे हैं:

SQL> alter session set NLS_SORT=BINARY;

Session altered.

SQL> select REGEXP_REPLACE ('TEST 3304 V2', '[`[email protected]#$%^&*()_+-3{}|;.:<>?,./]', ' ') as REG from dual;

REG
------------
TEST    4 V

भाषाई सॉर्टिंग के बारे में और पढ़ें

एनएलएस सेटिंग्स पर भरोसा करना हमेशा जोखिम भरा होता है, इसलिए शुरुआत या अंत में हाइफ़न रखने के लिए पैटर्न को पूरी तरह से बदलकर रेंज की समस्या से बचना बेहतर है, जो इसे एक सीमा के रूप में देखा जाना बंद कर देता है; अविनाश राज ने फिर से सुझाव दिया।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 9i में PostgreSQL सरणी () / array_to_string () कार्यों के बराबर

  2. Oracle JDBC रेडीस्टेटमेंट ऑब्जेक्ट से बाइंड पैरामीटर के मान कैसे प्राप्त करें

  3. Oracle निष्क्रिय कनेक्शन

  4. Group_concat MySQL फ़ंक्शन Oracle में समतुल्य है

  5. ORA-00904::अमान्य पहचानकर्ता Oracle sql