2011-12-09 15 views
5

मैं Users नामक तालिका से पंक्तियां चुनना चाहता हूं जहां कॉलम Logon"foo" के बराबर है - हालांकि, मैं "Foo" या "FOO" वापस करना चाहता हूं।क्या ओरेकल में कोई कॉलम केस केस संवेदनशील नहीं है?

मैं की तरह कुछ कर सकता है:

SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO'; 

और फिर अपरकेस करने के लिए अपने पैरामीटर परिवर्तित। हालांकि, हमारे कोड में हमारे पास सचमुच सैकड़ों धब्बे हैं जहां हमें इसे अपडेट करना होगा।

क्या तालिका स्कीमा स्वयं केस-असंवेदनशील बनाने का कोई तरीका है, इसलिए ये प्रश्न बिना संशोधन के काम करेंगे? धन्यवाद!

अद्यतन

मैं नहीं बल्कि पूरे डेटाबेस में या सत्र स्तर पर मामले संवेदनशीलता में परिवर्तन नहीं होगा। एसक्यूएल प्रश्नों को बदलना मुश्किल है क्योंकि हम .NET इकाई फ्रेमवर्क का उपयोग करते हैं और इस जगह के खिलाफ इस तालिका के खिलाफ LINQ क्वेरीज रखते हैं। ऐसा नहीं लगता है कि ईएफ स्वचालित रूप से कनवर्ट करने का समर्थन करता है जबतक कि आप प्रत्येक LINQ क्वेरी को भी बदलना नहीं चाहते हैं।

+0

जांचें http://stackoverflow.com/questions/2001165/oracle-11g-case-insensi tive-by-default – a1ex07

+0

मैं टेबल और/या कॉलम स्तर नियंत्रण रखने का एक तरीका ढूंढ रहा हूं, मैं अभी पूरे डेटाबेस को बदलना नहीं चाहता हूं। –

उत्तर

3

मेरे अपने प्रश्न का उत्तर दें क्योंकि मुझे नहीं लगता था कि प्रस्तावित उत्तरों में से कोई भी वास्तव में इस मुद्दे को संबोधित करता है।

ओरेकल केस-असंवेदनशील कॉलम प्रकार की अवधारणा का समर्थन नहीं करता है, और केस संवेदनशीलता केवल डेटाबेस या सत्र स्तर पर नियंत्रित की जा सकती है। इसके चारों ओर कुछ तरीके हैं, जैसे स्तंभ वर्चुअल या दृश्य के माध्यम से पढ़ना, लेकिन उनमें से प्रत्येक को आपको सही ऑपरेंड भी डालना होगा (जैसे कि WHERE X = UPPER(:p1)

मैंने अपना डेटाबेस अपडेट करना समाप्त कर दिया (जो कि सक्रिय निर्देशिका से उपयोगकर्ता नामों की एक सूची थी), ताकि मुझे अब असंवेदनशील मामले की तुलना नहीं करनी पड़े।

0

आप समान सभी स्तंभों के साथ अपनी मेज पर एक दृश्य सेट कर सकते हैं, प्रभावित स्तंभ जो upshifted किया जाएगा के लिए छोड़कर - कुछ की तरह:

create view v_Users as 
select Id, Name, UPPER(Logon) Logon, ... 
FROM Users 

- तो है एक वैश्विक अपने स्रोत कोड पर की जगह तालिका नाम को दृश्य नाम में बदलने के लिए - यद्यपि यदि आपकी तालिका को उपयोगकर्ता कहा जाता है, तो यह काफी खतरनाक हो सकता है ...

+2

उसे लॉगऑन को अपरकेस के रूप में पास करने के लिए अपने सभी प्रश्नों को भी बदलना होगा, जो वह टालने की कोशिश कर रहा है। –

+1

हाँ यह एक विचार है, फिर भी मुझे सही विकल्प को ऊपरी मामले में डालने के लिए सभी चयनों को फिर से लिखना होगा। अगर मैं ऐसा करने वाला हूं, तो मैं उन सभी स्थानों को भी अपडेट कर सकता हूं जहां मैं लॉगऑन द्वारा उपयोगकर्ताओं को देखता हूं - जो मुझे लगता है कि मुझे क्या करना है :) –

1

मुझे नहीं लगता कि आप इसे केवल एक कॉलम के लिए कर सकते हैं। आप निम्न दृष्टिकोण आज़मा सकते हैं: Logon कॉलम वर्चुअल को UPPER(s_Logon) के रूप में बनाएं (s_Logon बनाएं, मौजूदा Logon कॉलम से सभी मानों की प्रतिलिपि बनाएँ, Logon ड्रॉप करें, इसे वर्चुअल के रूप में बनाएं)। मेरा मानना ​​है कि यह SELECT एस के लिए काम करेगा, लेकिन insert/update के लिए आपको 's_Logon' तक पहुंचने की आवश्यकता होगी। उम्मीद है कि समझ में आता है।

+0

क्या यह कॉलम हमेशा ऊपरी मामले में नहीं होगा ? जब भी मैं इसकी तुलना करता हूं तब भी मुझे ऊपरी मामले में सही ऑपरेशन करना होगा। –

2

मैं पूरे डेटाबेस में या सत्र में केस-संवेदनशीलता नहीं बदलूंगा स्तर

क्या टेबल स्कीमा स्वयं केस-असंवेदनशील बनाने का कोई तरीका है, इसलिए ये प्रश्न केवल संशोधन के बिना काम करेंगे

हां, यह संभव है लेकिन संस्करण ओरेकल 12 सीआर 2 और ऊपर से।

-- default 
CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100)); 

INSERT INTO tab2(i, name) VALUES (1, 'John'); 
INSERT INTO tab2(i, name) VALUES (2, 'Joe'); 
INSERT INTO tab2(i, name) VALUES (3, 'Billy'); 

SELECT /*csv*/ * 
FROM tab2 
WHERE name = 'jOHN' ; 
/* 
"I","NAME" 
no rows selected 
*/ 

SELECT /*csv*/ 
     column_id, 
     column_name, 
     collation 
FROM user_tab_columns 
WHERE table_name = 'TAB2' 
ORDER BY column_id; 
/* 
"COLUMN_ID","COLUMN_NAME","COLLATION" 
1,"I","" 
2,"NAME","USING_NLS_COMP" 
*/ 

कॉलम स्तरीय:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100) COLLATE BINARY_CI); 

INSERT INTO tab2(i, name) VALUES (1, 'John'); 
INSERT INTO tab2(i, name) VALUES (2, 'Joe'); 
INSERT INTO tab2(i, name) VALUES (3, 'Billy'); 

SELECT /*csv*/ * 
FROM tab2 
WHERE name = 'jOHN' ; 
/* 
"I","NAME" 
1,"John" 
*/ 

-- COLUMN LEVEL 

SELECT /*csv*/ 
     column_id, 
     column_name, 
     collation 
FROM user_tab_columns 
WHERE table_name = 'TAB2' 
ORDER BY column_id; 
/* 
"COLUMN_ID","COLUMN_NAME","COLLATION" 
1,"I","" 
2,"NAME","BINARY_CI" 
*/ 

तालिका-स्तर:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100)) 
DEFAULT COLLATION BINARY_CI; 

स्कीमा-स्तर:

आप कई स्तरों (स्तंभ, मेज, स्कीमा) पर यह निर्धारित कर सकते हैं
CREATE USER myuser IDENTIFIED BY myuser 
DEFAULT TABLESPACE users 
DEFAULT COLLATION BINARY_CI; 
+1

साफ सुविधा - इस बारे में नहीं सुना था। यहां और अधिक: https://oracle-base.com/articles/12c/column-level-collation-and-case-insensitive-database-12cr2 –

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