2009-11-06 8 views
29

मेरे पास एक "बिल_डेट" फ़ील्ड है जो मैं खाली होने तक खाली (शून्य) होना चाहता हूं, जिस तारीख पर तिथि दर्ज की जाएगी।MySQL में डेटाटाइम फ़ील्ड में नल मानों को कैसे स्टोर करें?

मुझे लगता है कि MySQL को डेटाटाइम फ़ील्ड में नल मान पसंद नहीं हैं। क्या आपके पास इनमें से किसी को संभालने का एक आसान तरीका है, या क्या मुझे न्यूनतम तारीख को "पूर्ण समतुल्य" के रूप में उपयोग करने के लिए मजबूर किया गया है और फिर उस तारीख की जांच करें?

धन्यवाद।

जोड़ने के लिए संपादित:

ठीक है मैं देख पा रहे हैं कि MySQL शून्य मूल्य को स्वीकार करेंगे, लेकिन यह एक डेटाबेस अद्यतन के रूप में इसे स्वीकार नहीं करेंगे अगर मैं PHP का उपयोग रिकॉर्ड को अपडेट करने कर रहा हूँ।

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1 

मैं मैं वास्तव में करने की जरूरत है मान लेते हैं: -

चर नाम $bill_date है लेकिन अगर मैं $bill_date के लिए एक मूल्य भेजे बिना रिकॉर्ड को अपडेट यह NULL के रूप में चर नहीं छोड़ देंगे मैं इस त्रुटि मिलती है इस त्रुटि से बचने के लिए, NULL शब्द भेजें, या अद्यतन क्वेरी से इसे पूरी तरह से छोड़ दें? क्या मैं सही हू? धन्यवाद!!!

+0

MySQL datetime परिभाषा के लिए शून्य मान स्वीकार करता है, लेकिन अगर आप किसी कारण से नहीं तो लगता है और एक शून्य मान का उपयोग नहीं होगा, बस मान के रूप में '1000/01/01' और छोड़कर पंक्तियों का उपयोग कर विचार जो अपने प्रश्नों में अपने bill_date कॉलम के लिए वह मान रखें। – BraedenP

+0

माईस्क्ल डेटाटाइम फ़ील्ड में नल को अनुमति देता है। मुझे संदेह है कि समस्या mysql तक पहुंचने के तरीके से आती है। क्या आप अपने प्रश्न को उस तंत्र के साथ संपादित कर सकते हैं जिसका उपयोग आप डेटा तक पहुंचने के लिए कर रहे हैं? उदाहरण के लिए, क्या आप एक पर्ल लाइब्रेरी आदि का उपयोग कर अपने ओडीबीसी का उपयोग कर रहे हैं? – anschauung

+0

PHP का उपयोग - ऊपर मेरे संपादन देखें। – rhodesjason

उत्तर

42

MySQL datetime फ़ील्ड के लिए NULL मानों की अनुमति देता है। मैं सिर्फ यह परीक्षण किया:

mysql> create table datetimetest (testcolumn datetime null default null); 
Query OK, 0 rows affected (0.10 sec) 

mysql> insert into datetimetest (testcolumn) values (null); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from datetimetest; 
+------------+ 
| testcolumn | 
+------------+ 
| NULL  | 
+------------+ 
1 row in set (0.00 sec) 

मैं इस संस्करण का उपयोग कर रहा हूँ:

mysql> select version(); 
+-----------+ 
| version() | 
+-----------+ 
| 5.0.45 | 
+-----------+ 
1 row in set (0.03 sec) 

संपादित करें # 1: मैं अपने संपादन में देखते हैं कि आप PHP में हो रही है त्रुटि संदेश इंगित करता है कि आप एक से गुजर रहे हैं खाली स्ट्रिंग (यानी ''), null नहीं। एक खाली स्ट्रिंग null से भिन्न है और यह वैध datetime मान नहीं है, इसलिए आपको वह त्रुटि संदेश मिल रहा है। यदि आपको इसका मतलब है तो आपको विशेष एसक्यूएल कीवर्ड null पास करना होगा। साथ ही, null शब्द के चारों ओर कोई उद्धरण न डालें। null डालने के उदाहरण के लिए उपरोक्त मेरे insert कथन देखें।

संपादित # 2: क्या आप पीडीओ का उपयोग कर रहे हैं? यदि ऐसा है, तो जब आप अपने शून्य पैरामीटर को बांधते हैं, तो प्रकार का उपयोग करना सुनिश्चित करें जब null बाध्यकारी हो। पीडीओ का उपयोग करके null सही तरीके से डालने के तरीके पर answer to this stackoverflow question देखें।

+0

PHP का उपयोग करना - उपरोक्त मूल पोस्ट में मेरे संपादन देखें। – rhodesjason

+0

@ जेसन रोड्स: ठीक है, मैंने आपके संपादन को संबोधित करने के लिए अपना जवाब अपडेट कर दिया है। यदि आप अभी भी इसे काम नहीं कर पा रहे हैं, तो कृपया अपना PHP कोड पोस्ट करें। – Asaph

+0

@ जेसन रोड्स: मैंने कुछ संकेत शामिल किए हैं जो उपयोगी हो सकते हैं यदि आप पीडीओ का उपयोग कर रहे हैं। – Asaph

2

मैंने अभी MySQL v5.0.6 में परीक्षण किया है और डेटाटाइम कॉलम बिना किसी समस्या के शून्य स्वीकार किया गया है।

3

यह इस बात पर निर्भर करता है कि आप अपनी तालिका कैसे घोषित करते हैं। शून्य में अनुमति दी हैं नहीं किया जा:

create table MyTable (col1 datetime NOT NULL); 

लेकिन यह में अनुमति दी जाएगी:

create table MyTable (col1 datetime NULL); 

दूसरा डिफ़ॉल्ट है, इसलिए किसी को सक्रिय रूप से निर्णय लिया गया है चाहिए कि स्तंभ नल नहीं होना चाहिए।

18

यह एक समझदार बिंदु है।

एक शून्य तिथि शून्य तारीख नहीं है। वे वही देख सकते हैं, लेकिन वे नहीं हैं। MySQL में, एक शून्य दिनांक मान शून्य है।शून्य दिनांक मान एक खाली स्ट्रिंग ('') और '0000-00-00 00:00:00'

एक शून्य तिथि पर "... जहां mydate = ''" विफल हो जाएगा।
खाली/शून्य तिथि पर "... जहां mydate शून्य है" विफल हो जाएगा।

लेकिन अब चंचल हो जाएं। Mysql तिथियों में, खाली/शून्य तिथि कड़ाई से वही होती है। '0000-00-00 00:00:00':

उदाहरण

 
select if(myDate is null, 'null', myDate) as mydate from myTable where myDate = ''; 
select if(myDate is null, 'null', myDate) as mydate from myTable where myDate = '0000-00-00 00:00:00' 

दोनों उत्पादन द्वारा

। यदि आप myDate को '' या '0000-00-00 00:00:00' के साथ अपडेट करते हैं, तो दोनों चयन अभी भी वही काम करेंगे।

php में, mysql null तिथियों का प्रकार मानक mysql कनेक्टर के साथ सम्मानित किया जाएगा, और असली nulls ($ var === null, is_null ($ var) होना चाहिए)। खाली तिथियों को हमेशा '0000-00-00 00:00:00' के रूप में दर्शाया जाएगा।

मैं दृढ़ता से केवल नल तिथियों का उपयोग करने की सलाह देता हूं, या केवल खाली तिथियां यदि आप कर सकते हैं। (कुछ सिस्टम "वायरल" शून्य तिथियों का उपयोग करेंगे जो 1 9 70-01-01 (लिनक्स) या 0001-01-01 (ऑरैकल) जैसे ग्रेगोरियन तिथियां हैं।

खाली तिथियां php/mysql में आसान हैं। हैंडल करने के लिए "जहां फ़ील्ड शून्य है" नहीं है। हालांकि, आपको खाली फ़ील्ड प्रदर्शित करने के लिए '0000-00-00 00:00:00' दिनांक में 'मैन्युअल रूप से "बदलना होगा। (स्टोर करने या आपको खोजने के लिए शून्य तिथियों के लिए संभालने के लिए विशेष मामला नहीं है, जो अच्छा है)

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

शून्य तिथियां आम तौर पर अधिक काम होती हैं। लेकिन वे बहुत अधिक बहुत प्रश्नों के लिए शून्य तिथियों से तेज़ हैं।

1

विशेष रूप से त्रुटि आप हो रही है, आप MySQL में एक नल क्षेत्र के लिए PHP में कुछ इस तरह नहीं कर सकते करने के लिए संबंधित:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')'; 

है जो क्योंकि PHP में अशक्त एक खाली स्ट्रिंग के लिए समानता जाएगा MySQL में एक पूर्ण मान के समान नहीं है। इसके बजाय आप ऐसा करना चाहते हैं:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')'; 
बेशक आप is_null उपयोग करने के लिए की जरूरत नहीं है के

लेकिन मैं समझ है कि यह बिंदु को दर्शाता है थोड़ा बेहतर। खाली() या उस तरह कुछ उपयोग करने के लिए शायद सुरक्षित है। और यदि $ col2 एक स्ट्रिंग होता है जो आप क्वेरी में डबल कोट्स में संलग्न करेंगे, तो को न भूलें, 'न्यूल' स्ट्रिंग के आसपास के लोगों को शामिल करने के लिए, अन्यथा यह काम नहीं करेगा।

आशा है कि मदद करता है!

+0

पहले उदाहरण में आप बस ऐसा कर सकते थे: '$ sql = 'तालिका में प्रवेश करें (col1, col2) मूल्य (' $ col1। ', Null)';' – Pere

2

इसके लायक होने के लिए: मुझे पर्ल के माध्यम से एक MySQL तालिका को अपडेट करने का प्रयास करने वाला एक ही समस्या का सामना करना पड़ रहा था। अपडेट विफल हो जाएगा जब खाली स्ट्रिंग मान (किसी अन्य प्लेटफ़ॉर्म से पढ़ने से शून्य मूल्य से अनुवादित) दिनांक कॉलम (नीचे दिए गए कोड नमूने में 'dtcol') को पास किया गया था।मैं अंततः अपने अपडेट स्टेटमेंट में एम्बेडेड आईएफ स्टेटमेंट का उपयोग करके डेटा अपडेट करने में सफल रहा:

... 
    my $stmnt='update tbl set colA=?,dtcol=if(?="",null,?) where colC=?'; 
    my $status=$dbh->do($stmt,undef,$iref[1],$iref[2],$iref[2],$ref[0]); 
    ... 
3

मुझे विंडोज़ पर यह समस्या थी। 'शून्य के लिए आप STRICT_MODE अक्षम करना चाहिए (जो विंडोज प्रतिष्ठानों पर डिफ़ॉल्ट रूप से सक्षम)

BTW यह पारित करने के लिए मज़ेदार है'

पास करने के लिए '' शून्य के लिए:

यह समाधान है। मुझे नहीं पता कि वे इस तरह के व्यवहार क्यों करते हैं।

0

मुझे अभी पता चला है कि MySQL शून्य को ले जाएगा, बशर्ते फ़ील्ड के लिए डिफ़ॉल्ट न हो और मैं विवरणों को विशिष्ट लिखूं और उद्धरण छोड़ दें। यह अद्यतन के लिए भी काम करता है।

if(empty($odate) AND empty($ddate)) 
{ 
    $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' "; 
}; 
संबंधित मुद्दे