2012-12-10 18 views
20

मुझे आश्चर्य हुआ जब MySQL ने मुझे NOT NULL के साथ बनाए गए फ़ील्ड में NULL डालने की अनुमति दी। मैंने कुछ शोध किया और पाया कि सख्त मोड को कैसे सक्षम किया जाए। हालांकि, मुझे पूरा यकीन नहीं है कि STRICT_ALL_TABLES सक्षम होने पर MySQL प्रमाणीकरण क्या करता है।सख्त मोड सक्षम होने पर MySQL क्या करता है?

मैनुअल का कहना है:

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

मैं समझता हूं कि यह क्या गुम हो रहा है और यह कैसे संभालता है। मैं अस्पष्ट हूं कि यह अमान्य पर विचार करता है। मैं कुछ परीक्षण किया और निम्नलिखित की खोज की है:

  • तार जो बहुत लंबी हैं
  • संख्या है कि एक गैर NULL स्तंभ के लिए अमान्य
  • NULL रों हैं सीमा से बाहर हैं अमान्य हैं अमान्य हैं
  • TRUE और FALSE हमेशा वैध होने लगते हैं (वे क्रमश: 1 और 0 के हो जाते हैं)
  • अमान्य तिथियां अमान्य
  • शून्य दिनांक मान्य हैं कर रहे हैं (addit ional मोड इस व्यवहार) एक पूर्णांक क्षेत्र में
  • तैरता मान्य हैं (वे गोल पाने के) एक नंबर फ़ील्ड में
  • पत्र हैं बदलने के लिए सक्रिय किया जा सकता अमान्य

MySQL के अलावा अन्य किसी भी अन्य मान्यता जांच कर करता है ऊपर क्या बताया गया है?

मैनुअल 'कॉलम के लिए गलत डेटा प्रकार' कहता है, लेकिन एकमात्र स्थिति मैं देखता हूं कि यह वास्तव में खेल में आता है, यह संख्या एक फ़ील्ड में पत्र है। क्या डेटा प्रकार त्रुटियों के अन्य उदाहरण हैं?

क्या वहां कोई सूची है जो MySQL निष्पादित करता है?

संपादित करें: रिकॉर्ड के लिए, मेरा आवेदन पहले से ही व्यापक सत्यापन करता है। मैं सख्त मोड का उपयोग आखिरी मौका के रूप में कर रहा हूं, बस मामले में चेक। अगर मैं कुछ जांचना भूल जाता हूं, तो मैं चाहता हूं कि यह 'चुपचाप मेरे डेटा को उलझाने' के बजाय में तेजी से विफल हो।

+0

मैं महसूस कर रही आपको मिल डीबी को आपके लिए डेटा सत्यापन करने की इच्छा है। यदि ऐसा है, तो यह नीचे जाने का एक बुरा रास्ता है। – siride

+3

@ साइराइड: डीबीएमएस *** *** सत्यापन करने के लिए *** है (विदेशी कुंजी, प्राथमिक कुंजी, जांच बाधाएं, प्रकार सत्यापन)। तथ्य यह है कि MySQL आपको 'फरवरी, 31' स्टोर करने की अनुमति देता है मेरी राय में एक बग है। या इसे दूसरी तरफ रखने के लिए: यदि डीबीएमएस कोई सत्यापन नहीं करता है तो यह जाने का एक बहुत बुरा रास्ता है। –

+4

मैं पहले से ही आवेदन में सत्यापन करता हूं। मैं अच्छा प्रोग्रामिंग के लिए * प्रतिस्थापन * के रूप में सख्त मोड का उपयोग नहीं कर रहा हूं, बल्कि *** *** अच्छा प्रोग्रामिंग सुनिश्चित करने के लिए एक तरीका के रूप में। – toxalot

उत्तर

8

एक अच्छा संसाधन MySQL स्रोत की जांच करना है, और mysql-test/t/strict.test पढ़ना है ताकि वे स्ट्राइक मोड या पारंपरिक मोड (जो STRICT का सुपरसेट है) सेट करने के बाद परीक्षण कर सकें।

आप उत्कृष्ट अनुसंधान और परीक्षण किया था, लेकिन इस तरह के रूप में कुछ और मामलों, कर रहे हैं:

  • एक अपरिभाषित Enum मान सम्मिलित करने के लिए कोशिश कर रहा है।
  • किसी भी पूर्ण कॉलम के लिए एक डिफ़ॉल्ट मान डालने का प्रयास नहीं किया गया है।
  • कास्ट() का उपयोग करने के पूर्णांक के लिए तार कन्वर्ट करने के लिए कोशिश कर रहा है, आदि VARCHAR की
  • रूपांतरण MEDIUMTEXT या LongText अगर आप लंबाई तालिकाओं और स्तंभों के लिए टिप्पणी तार के एक से अधिक 65536
  • ट्रंकेशन दे।
  • स्ट्रिंग का रूपांतरण YEAR प्रकार में।
  • डुप्लिकेट प्रविष्टियों के साथ एक एसईटी या ईएनएम कॉलम परिभाषित करना।

mysql-test/include/strict_autoinc.inc, क्योंकि यह ऑटो-इंक वैल्यू बहुत बड़ा होने पर अतिप्रवाह के लिए परीक्षण करता है।

कुछ अन्य टेस्ट फाइलें हैं जो विशिष्ट परीक्षणों के लिए STRICT मोड का उपयोग करती हैं, लेकिन मैंने उनकी जांच नहीं की।

+0

के साथ उम्मीद कर रहा था मुझे स्रोत कोड कैसे/कहां मिल सकता है? – toxalot

+0

एक और मामला एक संयुक्त नंबर को एक अज्ञात कॉलम में डालने का प्रयास कर रहा है। – toxalot

+0

http://dev.mysql.com/downloads/mysql/#downloads, प्लेटफ़ॉर्म के रूप में "स्रोत कोड" का चयन करें। –

3

मैंने उपयोग किए जा रहे STRICT_ALL_TABLES के उदाहरण खोजने के लिए MySQL 5.5.28 (सामुदायिक सर्वर संस्करण) के स्रोत कोड को grepped।

मैंने जो देखा उससे, ऐसा लगता है कि आपकी सूची पहले से ही पूरी तरह से पूर्ण है, लेकिन नीचे कुछ और चीजें हैं जिन्हें मैंने STRICT_ALL_TABLES के उपयोग के बारे में सीखा। पहला एक और सत्यापन है, जबकि बाकी सभी त्रुटियों और चेतावनियों से निपटते हैं।

  • ज्यामिति कॉलम का डिफ़ॉल्ट मान नहीं हो सकता है। (एसक्यूएल/field.cc: 9 3 9 4)
  • यदि कोई तालिका टिप्पणी 2048 वर्णों से अधिक लंबी है, तो MySQL चेतावनी के साथ टिप्पणी को कम करने के बजाय त्रुटि उत्पन्न करता है। (एसक्यूएल/unireg.cc: 231)
  • यदि फ़ील्ड टिप्पणी 1024 वर्णों से अधिक लंबी है, तो MySQL चेतावनी के साथ टिप्पणी को कम करने के बजाय त्रुटि उत्पन्न करता है। (एसक्यूएल/unireg.cc: 739)
  • एक डालने या अद्यतन पर, यदि एक एसईटी या ईएनएन MySQL में डुप्लिकेट मान मौजूद है तो चेतावनी के बजाय त्रुटि उत्पन्न होती है। (वर्ग/sql_table.cc: 2503)
  • ऐसे ऑपरेशन का एक समूह है जो केवल एक चेतावनी के साथ आगे बढ़ने के बजाय STRICT_ALL_TABLES के साथ चेतावनी को रोक देगा। यह मेरे लिए सूचीबद्ध करने के लिए बहुत अधिक हैं, और abort_on_warning ध्वज की सेटिंग कोड से बहुत दूर है जो मेरे लिए चेतावनी बनाता है ताकि वे आसानी से दस्तावेज (या यहां तक ​​कि समझ सकें)। लेकिन अगर किसी को भी अपने अपने हाथ स्रोत कोड में गंदा प्राप्त करना चाहता है, कुछ स्थानों पर शुरू करने के लिए एसक्यूएल/sql_update.cc होगा: 630 और एसक्यूएल/sql_insert.cc: 841
संबंधित मुद्दे