मैं एक डीबी को माईसाम से इनो डीबी में परिवर्तित कर रहा हूं। मुझे #1292 गलत डेटाटाइम मान की त्रुटि मिल रही है: '0000-00-00 00:00:00'। मैंने इनमें से कुछ त्रुटियों के बारे में पढ़ा है लेकिन मैं डीबी में जानकारी संग्रहीत करने के तरीके को नहीं बदल सकता। यह उपरोक्त प्रारूप में संग्रहीत हो जाता है। क्या इसका कोई अच्छा समाधान है?

2
michael 20 पद 2020, 05:53
1
ऐसी तिथियों को स्टोर न करें जो वैसे भी मौजूद नहीं हैं। इसके बजाय NULL स्टोर करें।
 – 
sticky bit
20 पद 2020, 06:17
धन्यवाद। मैं चाहता हूं लेकिन निम्न क्वेरी का उपयोग करते समय: अद्यतन mytable SET column_name= NULL WHERE column_name= '0000-00-00 00:00:00' मुझे वही त्रुटि मिलती है - कि यह एक गलत समय मान है। मैं कॉलम संरचना को नहीं बदल सकता जो एक DATETIME है। NULL नया डिफ़ॉल्ट है, लेकिन तब नहीं था जब कुछ डेटा दर्ज किया गया था
 – 
michael
20 पद 2020, 06:26
1
https://stackoverflow.com/a/37780259/378779 से: UPDATE users SET col = NULL WHERE CAST(col AS CHAR(20)) = '0000-00-00 00:00:00';
 – 
kmoser
20 पद 2020, 07:07
धन्यवाद @kmoser यह इस वातावरण में काम नहीं करता है क्योंकि डिफ़ॉल्ट वह खराब प्रारूप है और क्योंकि इसकी WP की मास्टर टेबल आपको इसे बदलने में सावधानी बरतनी होगी
 – 
michael
20 पद 2020, 21:17

1 उत्तर

सबसे बढ़िया उत्तर

यहाँ त्रुटि है:

mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'd' at row 1

यह समस्या क्यों है? क्योंकि '0000-00-00 00:00:00' sql मोड NO_ZERO_DATE और NO_ZERO_IN_DATE का उल्लंघन करता है। MySQL 8.0 में, जब आप STRICT_TRANS_TABLES या STRICT_ALL_TABLES का उपयोग करते हैं तो ये मोड निहित होते हैं।

डेटाटाइम की तुलना करते समय अपने WHERE क्लॉज में केवल उस मान का उपयोग करना उल्लंघन को ट्रिगर करता है, क्योंकि MySQL उस स्ट्रिंग को डेटाटाइम मान में बदलने का प्रयास करता है।

यहां एक समाधान है: अस्थायी रूप से अमान्य दिनांक मानों को अनुमति देने के लिए sql मोड को गैर-सख्त में बदलें।

mysql> set sql_mode='';

यह केवल आपके वर्तमान सत्र के दौरान sql_mode को बदलता है। एक बार जब आप mysql क्लाइंट को छोड़ देते हैं, तो सत्र-दायरे वाले विकल्प गायब हो जाएंगे, और अगली बार जब आप कोई सत्र खोलेंगे, तो यह वैश्विक सेटिंग से विकल्प लेगा।

यह अद्यतन की अनुमति देता है, ताकि आप अपनी क्वेरी में उस अमान्य डेटाटाइम स्ट्रिंग का उपयोग कम से कम लंबे समय तक संबंधित मानों को न्यूल में बदलने के लिए कर सकें।

mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from mytable;
+----+------+
| id | d    |
+----+------+
|  1 | NULL |
+----+------+

इस क्लीनअप ऑपरेशन को छोड़कर अपने sql मोड को गैर-सख्त न बनाएं। सख्त sql मोड का उपयोग करना एक अच्छी बात है, क्योंकि यह डेटाबेस को फर्जी डेटा मानों को संग्रहीत करने से रोकता है। यदि आप किसी ऐसे मान को संग्रहीत करते हैं जो किसी स्तंभ में फ़िट नहीं होता है, तो सख्त मोड डेटा काट-छाँट को भी रोकता है।

1
Bill Karwin 20 पद 2020, 19:11
इसके लिए धन्यवाद। डिफ़ॉल्ट WP टेबल NULL के बजाय पुराने अनावश्यक TIMEFORMAT का उपयोग करते हैं क्योंकि उनके डिफ़ॉल्ट हैमस्ट्रिंग उन्हें बदलने की संभावना है। यह समाधान समझ में आता है।
 – 
michael
20 पद 2020, 21:12
तो अगला मुद्दा यह है कि यह 0000-00-00 00:00:00 इस WP मास्टर टेबल में 4 कॉलम के लिए डिफ़ॉल्ट है। इसके आसपास के तरीके डिफ़ॉल्ट को बदलने के अलावा जो जोखिम भरा लगता है
 – 
michael
20 पद 2020, 21:28
मैं डिफ़ॉल्ट बदल दूंगा। यदि आपके पास कोई डिफ़ॉल्ट नहीं है, तो एक घोषित न करें। किसी तालिका के लिए कोई डिफ़ॉल्ट नहीं होना और न्यूल भी नहीं होना ठीक है, इसका मतलब है कि किसी भी INSERT को एक मान निर्दिष्ट करना होगा या फिर कोई त्रुटि प्राप्त होगी। जाहिर है इसके लिए आपको पहले अपने ऐप का सावधानीपूर्वक परीक्षण करना होगा अन्यथा इसमें आपको असफलता मिल सकती है।
 – 
Bill Karwin
20 पद 2020, 22:00
ठीक है मैं इसे आजमा सकता हूँ। ये डिफ़ॉल्ट हैं जैसा कि WP द्वारा रखा गया है, मेरे द्वारा नहीं, इसलिए मैं घबराया हुआ था।
 – 
michael
20 पद 2020, 22:27
यह दुर्भाग्य से WP में अमान्य दिनांक मानों पर भरोसा करने के लिए एक खराब डिज़ाइन निर्णय है। कई WP प्लगइन्स भी इसके साथ एक सम्मेलन के रूप में चले गए। अब इतने सारे स्वतंत्र प्लगइन्स को ठीक करना कठिन है। पढ़ें core.trac.wordpress.org/ticket/41785
 – 
Bill Karwin
20 पद 2020, 22:34