क्या संख्यात्मक स्तंभों में गैर-संख्यात्मक मानों के आवेषण को स्वीकार किए बिना SQLite कम उपयोगी होगा?


10

SQLite में निम्न कथन सफल होगा और स्ट्रिंग को उस SALARYकॉलम में डाला / अपडेट किया जाएगा जो टाइप का है INTEGER:

update employee set salary='TOO MUCH' where emp_id=1;

ध्यान दें कि शून्य डाला नहीं जाएगा / अपडेट नहीं किया जाएगा लेकिन वास्तविक "TOU MUCH" स्ट्रिंग है, इसलिए यह ऑर्टोमेटिक प्रकार के रूपांतरण के बारे में नहीं है।

सामान्य प्रश्न:

यह एक सुविधा है , बग नहीं है। SQLite डायनामिक टाइपिंग का उपयोग करता है। यह डेटा प्रकार की बाधाओं को लागू नहीं करता है। किसी भी प्रकार का डेटा (आमतौर पर) किसी भी कॉलम में डाला जा सकता है। आप पूर्णांक स्तंभों में मनमाने ढंग से लंबाई के तार लगा सकते हैं, बूलियन कॉलम में फ्लोटिंग पॉइंट नंबर या चरित्र स्तंभों में दिनांक। आप जिस डेटा को क्रिएट टेबल कमांड में एक कॉलम पर असाइन करते हैं, वह उस कॉलम में क्या डेटा रखा जा सकता है, इसे प्रतिबंधित नहीं करता है। हर स्तंभ एक मनमाना लंबाई स्ट्रिंग धारण करने में सक्षम है। (एक अपवाद है: INTEGER PRIMARY KEY के प्रकार के कॉलम में केवल 64-बिट हस्ताक्षरित पूर्णांक हो सकता है। यदि आप किसी पूर्णांक के अलावा कुछ भी एक पूर्णांक कुंजी स्तंभ में रखने का प्रयास करते हैं तो एक त्रुटि होगी।)

तो यह व्यवहार स्पष्ट रूप से जानबूझकर है, फिर भी मुझे आश्चर्य है कि SQLite के पास यह व्यवहार क्यों है, क्योंकि अधिकांश अन्य SQL डेटाबेस के बारे में मुझे काफी भिन्न व्यवहार के बारे में पता है, वे एक त्रुटि को बढ़ाएंगे, या स्ट्रिंग 0 में परिवर्तित करेंगे, जब गैर-संख्यात्मक स्ट्रिंग डालने की कोशिश करेंगे एक संख्यात्मक कॉलम।

  • क्या इस व्यवहार के बिना SQLite लाइब्रेरी कम उपयोगी होगी?

  • क्या यह पुस्तकालय को छोटा और तेज रखने के लिए डिज़ाइन द्वारा बनाया गया है?

  • जब एक संख्यात्मक स्तंभ में एक स्ट्रिंग डालने की कोशिश कर रहे हैं, तो त्रुटियों को बढ़ाने के लिए SQLite पुस्तकालय काफी धीमा या बड़ा होगा?


9
किसी ने एक बार कहा था कि "विपणन विभाग द्वारा वर्णित एक विशेषता एक बग है"।
Dan Pichelman

3
मुझे संदेह है कि यह प्रदर्शन और डेटा-घनत्व के लिए अच्छा है, हालांकि यह कोड-आकार के लिए फायदेमंद हो सकता है। सब सब में, मैं इसे एक जानबूझकर (या कम से कम अपनाया हुआ) गलत-विशेषता कहूंगा।
डिडुप्लिकेटर

3
"यह मुझे एक छोटे आकार, कम-संसाधन वाले पुस्तकालय में रहने के लिए लगाई गई सीमा लगती है जो आमतौर पर एम्बेडेड सिस्टम के लिए उपयोग किया जाता है जिसके लिए वास्तविक समय के प्रदर्शन की आवश्यकता होती है ..." मैं एक प्रकार की जांच की कल्पना नहीं कर सकता कि एक बूंद से अधिक कुछ भी हो। डिस्क IO की किसी भी राशि के संचालन के लिए समय / स्थान प्रदर्शन बाल्टी। इसके अलावा, उन्हें कोड में अतिरिक्त जांच करनी होगी क्योंकि वे डेटा को केवल निश्चित आकार के होने का अनुमान नहीं लगा सकते हैं, इसलिए यकीनन गतिशील टाइपिंग आपके प्रदर्शन की लागत है।
डोभाल

1
@DocBrown कारण नहीं है कि मैं ऐसा कहता हूं, लेकिन क्योंकि यह sui जेनिसिस है
तुलसी कोर्डोवा

2
@ user61852 मेरा सुझाव है कि आप इस प्रश्न को पूरी तरह से फिर से लिखें और इस पर ध्यान केंद्रित करें कि क्या SQLite की डायनामिक टाइपिंग इसे प्रदर्शन लाभ देगी, और X / Y संदर्भ में डायनामिक टाइपिंग की सुविधा / बग भेद या सामान्य उपयोगिता / बेकारता के किसी भी उल्लेख को छोड़ दें।
डोभाल

जवाबों:


8

नहीं, डायनेमिक टाइपिंग के लिए अधिक संग्रहण स्थान और अधिक प्रसंस्करण समय दोनों की आवश्यकता होती है, खासकर जब से वे टाइप आत्मीयता भी जोड़ते हैं, जिसका अर्थ है कि यह एक पसंदीदा प्रकार है जिसे प्रोग्रामर अनदेखा करने के लिए स्वतंत्र है। यह वास्तव में वास्तविक व्यापार बंद लागत के साथ एक जानबूझकर विशेषता है। SQLite लक्ष्यों के उपयोग के लिए वे लागत प्रभावी रूप से नगण्य हैं, लेकिन वे अभी भी वहां हैं।

ऐसी सुविधाओं की उपयोगिता को देखना मुश्किल है क्योंकि आप इसे आपके लिए उपलब्ध होने के आदी नहीं हैं। इसकी कमी के लिए समाधान अब आपको अधिक स्वाभाविक लगता है। आपके पूर्व अनुभव के कारण, आप इसे एक INTEGER फ़ील्ड के रूप में सोच रहे हैं जो कभी भी कुछ और नहीं होगा, लेकिन SQLite इसे किसी भी प्रकार के क्षेत्र के रूप में अधिक देखता है, लेकिन संभवतः इसमें पूर्णांक शामिल होंगे। शायद यह एक कंपनी के लिए एक ज़िप कोड है जो ज्यादातर अमेरिका में व्यापार करता है, लेकिन कनाडा के मुट्ठी भर ग्राहक हैं। पूर्णांक आत्मीयता को निर्दिष्ट करने के लिए उपयोगकर्ता को अनुमति देने से प्रत्येक पंक्ति में एक स्ट्रिंग बनाने पर बहुत अधिक स्थान बच जाएगा, लेकिन फिर भी आपको वह विकल्प प्रदान करता है।


3
मैंने अपने प्रश्न के लिए एक अद्यतन लिखा है कि स्ट्रिंग "TOO MUCH" को एक संख्यात्मक कोलम में सफलतापूर्वक संग्रहीत किया जाए । स्वचालित रूपांतरण शून्य को सम्मिलित करेगा। इसके अलावा यह पहला संबंधपरक डेटाबेस कार्यान्वयन है जो मुझे पता है कि इसकी अनुमति होगी। मैंने MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL और Sybase SQL Anywhere के साथ काम किया है।
ट्यूलेंस कोर्डोवा

2
मैं आपकी टिप्पणी नहीं समझता। मेरे उत्तर के बारे में स्वचालित रूपांतरण से कोई लेना देना नहीं था।
कार्ल बेवेलफेल्ट

1
SQLite उन्हें डेटाटाइप के बजाय भंडारण वर्ग मानता है। sqlite.org/datatype3.html
जेएफओ

1
स्पष्ट रूप से लिखे जाने के लिए तैयार किया गया है, लेकिन आप डेटा सटीकता को साबित करने में इस समस्या की अनदेखी कर रहे हैं आप अपने DB से कुछ पूर्णांक नहीं निकाल सकते हैं और मान सकते हैं कि वे पूर्णांक होंगे। ( "गतिशील टाइपिंग" है बेतहाशा साथ अंतर पर वास्तविक संबंधपरक मॉडल ही ।)
वाइल्डकार्ड

1
पूरी तरह से अनदेखी टाइपिंग की लागत थोड़ा भंडारण स्थान और प्रोसेसर समय से अधिक है।
डेडएमजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.