sql - एसक्यूएल पोर्टेबिलिटी गेचस




database orm (12)

मेरी कंपनी ने मुझे एक पायथन ओआरएम के लिए ओरेकल के लिए एक बैक एंड खत्म करने पर काम कर रहा है। मैं आश्चर्यचकित हूं कि साधारण सामान के लिए भी RDBMSes काम करते हैं। मैंने ओरेकल और अन्य आरडीबीएमएस के बीच के अंतर के बारे में बहुत कुछ सीखा है। सरासर जिज्ञासा से बाहर, मैं और अधिक सीखना चाहता हूँ।

एसक्यूएल को एक प्लेटफॉर्म से दूसरे पोर्टिंग के संदर्भ में कुछ सामान्य "गेतक" क्या हैं?

कृपया, उत्तर के लिए केवल एक पास वाला नंबर


एसक्यूएल को एक प्लेटफॉर्म से दूसरे पोर्टिंग के संदर्भ में कुछ सामान्य "गेतक" क्या हैं?

वाक्यांशों में शब्दकोष शब्द को प्रतिस्थापित करके English से Russian अनुवाद करने के प्रयासों के समान ही

हैलो और अलविदा के लिए काम करता है, लेकिन मरियम के लिए शेक्सपियर के कुछ नहीं कहने के लिए एक छोटे से भेड़ का बच्चा था

अलग-अलग RDBMS की अलग-अलग संस्कृतियां हैं, उनके नाम पर SQL होने के बावजूद

उदाहरण के लिए, पंक्ति को सीमित करना

Oracle :

WHERE rownum = 1

SQL Server :

SELECT TOP 1

MySQL और PostgreSQL :

LIMIT 1

DB2 :

SELECT * ... FETCH FIRST 1 ROW ONLY

चार अलग खंड


MySQL के विरोध में उद्धरण चिह्नों के लिए ओरेकल का एक अलग दृष्टिकोण है

MySQL: `object_name`, 'string', "string"
Oracle: "object_name", 'string'

इसके अलावा, भागने अलग है

MySQL: 'It\'s easy'
Oracle: 'It''s slightly confusing'

(ध्यान दें कि ओरेकल में उद्धरणों के अलावा कुछ भी बचने के लिए, आप अपनी क्वेरी में एस्केपई निर्देश का उपयोग कर सकते हैं; SELECT * FROM testTable WHERE प्रतिशत = '50 \% 'ESCAPE' \ ')


ऑपरेटर का समर्थन सेट करें

UNION / UNION ALL के अलावा, सेट ऑपरेटर का समर्थन सभी डेटाबेस में बहुत ही आकर्षक है। ओरेकल और एसक्यूएल सर्वर उनमें से अधिकांश समर्थन करते हैं, लेकिन ओरेकल एक MINUS ऑपरेशन के साथ-साथ समान मानक EXCEPT DISTINCT ऑपरेशन का समर्थन करता है। AFIK, MySQL केवल यूनिअन का समर्थन करता है (कोई इंटरसेक्ट या अतिरिक्त समर्थन नहीं)


ओरेकल आपको एक क्वेरी में एकाधिक सम्मिलित करने की अनुमति नहीं देता है। MySQL इस अनुमति देता है:

INSERT INTO test(id, name) VALUES (1, 'foo'),(2, 'bar');

ओरेकल एफआरएम खंड के बिना एक चयन बयान की अनुमति नहीं देता है इसलिए, आप इस तरह से प्रश्न नहीं कर सकते:

SELECT 1

इसके बजाय, आपको यह कहना है कि क्वेरी DUAL तालिका से है:

SELECT 1 FROM DUAL

कर्सर के साथ ओरेकल की कोई समस्या नहीं होती है, ये SQL सर्वर में एक बड़ी कार्यक्षमता समस्या है।

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

तिथियां एक और चीज हैं जो डाटाबेस से डाटाबेस में बहुत भिन्नता से प्रतीत होती हैं।

डेटाटाइप या तो बराबर नहीं हैं एक बात जो कि नए सर्वर से SQL सर्वर को प्राप्त करना है, वह टाइमस्टैम्प डेटा प्रकार में दिनांक और समय के साथ कुछ भी नहीं है और डेटाटाइम मान में परिवर्तित नहीं किया जा सकता है।


बहु-मूल्य में क्लाज़ क्वेरीज़ मैं ओरेकल पर इन सभी समय का उपयोग करता था और मुझे पता था कि आप SQL सर्वर में ऐसा नहीं कर सकते। उदाहरण के लिए, यह क्वेरी:

SELECT * FROM mytable WHERE (col1, col2) IN ( SELECT col1, col2 FROM othertable )

बाहरी जुड़ने के लिए ओरेकल के (+) सिंटैक्स की तरह अदृश्य लग रहे वाक्यविन्यास मैं इस सिंटैक्स के लिए काम करने वाली कंपनी में मानक LEFT OUTER JOIN / LEFT JOIN वाक्यविन्यास के बजाय सभी जगह इस्तेमाल किया था, जिसने MySQL को कुछ चीजों को काफी दर्द के लिए पोर्टिंग किया था।


विभिन्न डेटाबेस बाइनरी डेटा थोड़ा अलग संभालते हैं। उदाहरण के लिए, यह MySQL के अंतर्गत काम करेगा:

mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t SET c = 'z';
Query OK, 1 row affected (0.01 sec)

हालांकि, ओरेकल इन मानों पर निर्भर करता है हेक्स:

SQL> CREATE TABLE t (c RAW(3));

Table created.

SQL> INSERT INTO t VALUES ('z');
INSERT INTO t VALUES ('z')
                 *
ERROR at line 1:
ORA-01465: invalid hex number

इसके बजाय, हमें इसे हेक्स में बदलना होगा:

SQL> INSERT INTO t VALUES (rawtohex('z'));

1 row created.

अस्थायी टेबल्स - ओरेकल बनाम एसक्यूएल सर्वर / माय एसक्यूएल ओरेकल से एमएस / माईएसक्यूएल में संक्रमण, कोई समस्या नहीं है। दूसरी तरफ, थोड़ा अलग।


एसक्यूएल सर्वर और ओरेकल के बीच अंतरों की एक सूची, जिसे मैंने पोर्टिंग करते समय सामना किया है:

एएनएसआई मानक एसक्यूएल पूरी तरह से डेटाबेस के बीच पोर्टेबल सोचते हैं? फिर से विचार करना।

एएनएसआई मानक एसक्यूएल लेखन व्यावहारिक नहीं है


मुझे एक अजीब ओरेकल की समस्या याद आती है जो मुझे पूरी तरह से ग्वेदर से मिल गई मुझे नहीं पता कि यह यह उदाहरण या डिफ़ॉल्ट सेटिंग्स का एक कॉन्फ़िगरेशन था, लेकिन हम एक IN स्टेटमेंट में 1000 से अधिक तत्व नहीं कर सके। इसलिए हमें यह करना था कि क्या करना चाहता था:

SELECT Col1,Col2 
FROM Table
WHERE Code IN (1,2,3,...,1000)
OR Code IN (1001,1002,1003,...,2000)

आदि।

बदसूरत, लेकिन यह काम किया।

(इससे पहले कि कोई उप-क्वेरी या इनलाइन दृश्य का स्पष्ट समाधान बताता है, क्वेरी पूरी तरह से अलग प्रणाली पर उत्पन्न होती है)





rdbms-agnostic