console - DATE या DATETIME के लिए डिफ़ॉल्ट मान सेट करते समय mysql में त्रुटि




(9)

मैं MySQL सर्वर 5.7.11 चला रहा हूं और यह वाक्य:

updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

काम नहीं कर रहा है त्रुटि दे रहा है:

ERROR 1067 (42000): Invalid default value for 'updated'

लेकिन निम्नलिखित:

updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

बस काम करता है

DATE के लिए एक ही मामला।

एक sidenote के रूप में, यह mysql दस्तावेज़ों में उल्लेख किया गया है:

DATE का प्रकार किसी दिनांक भाग वाले मानों के लिए उपयोग किया जाता है लेकिन कोई समय नहीं होता है। MySQL 'YYYY-MM-DD' प्रारूप में DATE मानों को पुनर्प्राप्त और प्रदर्शित करता है। समर्थित श्रेणी '1000-01-01' से '99 99-12-31' है।

भले ही वे यह भी कहते हैं:

अमान्य दिनांक, DATETIME, या TIMESTAMP मान उपयुक्त प्रकार ('0000-00-00' या '0000-00-00 00:00:00') के "शून्य" मान में परिवर्तित हो जाते हैं।

MySQL दस्तावेज़ से दूसरे उद्धरण को ध्यान में रखते हुए, क्या कोई मुझे बता सकता है कि यह त्रुटि क्यों दे रहा है?


Answers

यह जवाब सिर्फ mysql 5.7 के लिए है:

सबसे अच्छा वास्तव में sql_mode को खाली में सेट नहीं किया गया है, इसके बजाय PHP में एक सत्र चर के साथ उपयोग करें:

SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

इसलिए कम से कम आप एक और डिफ़ॉल्ट मान रखते हैं

यह पागल है कि mysql दस्तावेज़ स्पष्ट नहीं है, आपको sql_mode में इस पराजय मान को हटाने की आवश्यकता है:

NO_ZERO_IN_DATE, NO_ZERO_DATE, मैं समझता हूं, लेकिन भविष्य के संस्करणों में इसे बंद कर दिया जाएगा।

STRICT_ALL_TABLES, इसके साथ, पैरामीटर को अनदेखा करने से पहले, इसलिए आपको इसे भी हटाने की आवश्यकता है।

आखिरकार पारंपरिक भी, लेकिन प्रलेखन इस पैरामीटर के बारे में बात करता है: "कॉलम में गलत मान डालने पर" चेतावनी के बजाय त्रुटि दें ", इस पैरामीटर के साथ, शून्य मानों वाली तिथियां डाली नहीं गई हैं, लेकिन हाँ के बिना

mysql वास्तव में इन मानकों और संयोजनों के साथ व्यवस्थित नहीं है।


मुझे यह त्रुटि WAMP 3.0.6 के साथ MySQL 5.7.14 के साथ मिली थी।

समाधान :

पंक्ति 70 बदलें (यदि आपकी c:\wamp\bin\mysql\mysql5.7.14\my.ini फ़ाइल c:\wamp\bin\mysql\mysql5.7.14\my.ini गई है) c:\wamp\bin\mysql\mysql5.7.14\my.ini फ़ाइल से

sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

सेवा मेरे

sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

और सभी सेवाओं को पुनरारंभ करें।

यह सख्त मोड अक्षम कर देगा। प्रलेखन के अनुसार, "सख्त मोड" का अर्थ है या तो दोनों या दोनों STRICT_TRANS_TABLES या STRICT_ALL_TABLES सक्षम हैं। documentation कहता है:

"MySQL 5.7 में डिफ़ॉल्ट SQL मोड में इन मोड शामिल हैं: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, और NO_ENGINE_SUBSTITUTION।"


बस लाइन जोड़ें: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

फ़ाइल के अंदर: /etc/mysql/mysql.conf.d/mysqld.cnf

तो sudo service mysql restart


पहले वर्तमान सत्र sql_mode चयन करें:

SELECT @@SESSION.sql_mode;

फिर आपको उस डिफ़ॉल्ट मान की तरह कुछ मिल जाएगा:

'ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'

और फिर 'NO_ZERO_DATE' बिना sql_mode सेट करें:

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

यदि आपके पास अनुदान है, तो आप इसे GLOBAL लिए भी कर सकते हैं:

SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';

विन्यास वाक्यविन्यास मुद्दा

* निक्स सिस्टम के तहत MYSQL (परीक्षण 5.7। *) के कुछ संस्करणों पर आपको इस वाक्यविन्यास का उपयोग करना चाहिए:

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"

ये काम नहीं करेंगे:

डैश कोई उद्धरण

sql-mode=NO_ENGINE_SUBSTITUTION

underscore कोई उद्धरण

sql_mode=NO_ENGINE_SUBSTITUTION

अंडरस्कोर और उद्धरण

sql_mode="NO_ENGINE_SUBSTITUTION"

कॉन्फ़िगरेशन मानों और SQL-मोड की एक और पूर्ण समीक्षा:

स्थायी एसक्यूएल मोड झंडे कैसे सेट करें


MySQL वर्कबेंच के साथ समस्या को हल करने के लिए (सर्वर पक्ष पर समाधान लागू करने के बाद):

प्राथमिकता पैनल में TRADITIONAL में SQL_MODE निकालें।


त्रुटि एसक्यूएल मोड की वजह से है जो नवीनतम MYSQL 5.7 दस्तावेज के अनुसार सख्त मोड हो सकती है

MySQL दस्तावेज़ीकरण 5.7 कहते हैं :

सख्त मोड प्रभावित करता है कि सर्वर वैध तिथि के रूप में '0000-00-00' को अनुमति देता है: यदि सख्त मोड सक्षम नहीं है, तो '0000-00-00' की अनुमति है और प्रविष्टियां कोई चेतावनी नहीं देती हैं। यदि सख्त मोड सक्षम है, तो '0000-00-00' की अनुमति नहीं है और प्रविष्टियां एक त्रुटि उत्पन्न करती हैं, जब तक कि इग्नोर भी नहीं दिया जाता है। इंसर्ट इग्नोर और अद्यतन इग्नोर के लिए, '0000-00-00' की अनुमति है और आवेषण चेतावनी उत्पन्न करते हैं।

MYSQL मोड की जांच करने के लिए

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

STRICT_TRANS_TABLES मोड को अक्षम करना

हालांकि 0000-00-00 00:00:00 प्रारूप को अनुमति देने के लिए आपको mysql कॉन्फ़िगरेशन फ़ाइल में या कमांड द्वारा STRICT_TRANS_TABLES मोड को अक्षम करना होगा

आदेश से

SET sql_mode = '';

या

SET GLOBAL sql_mode = '';

कीवर्ड GLOBAL का उपयोग करने से सुपर प्रीविलिज की आवश्यकता होती है और यह उस समय से सभी क्लाइंट कनेक्ट होने वाले संचालन को प्रभावित करता है

अगर ऊपर /etc/mysql/my.cnf ( /etc/mysql/my.cnf के अनुसार) पर जाने से /etc/mysql/my.cnf काम नहीं कर रहा है और STRICT_TRANS_TABLES टिप्पणी करें

साथ ही, यदि आप सर्वर स्टार्टअप पर एसक्यूएल मोड को स्थायी रूप से सेट करना चाहते हैं तो लिनक्स या मैकोज़ पर my.cnf में SET sql_mode='' शामिल करें। विंडोज़ के लिए यह my.ini फ़ाइल में किया जाना है।

ध्यान दें

हालांकि MYSQL 5.6 में डिफ़ॉल्ट रूप से सख्त मोड सक्षम नहीं है। इसलिए यह MYSQL 6 दस्तावेज़ के अनुसार त्रुटि उत्पन्न नहीं करता है जो कहता है

MySQL आपको "0000-00-00" के "शून्य" मान को "डमी दिनांक" के रूप में संग्रहीत करने की अनुमति देता है। यह कुछ मामलों में नल मानों का उपयोग करने से अधिक सुविधाजनक है, और कम डेटा और अनुक्रमणिका स्थान का उपयोग करता है। '0000-00-00' को अस्वीकार करने के लिए, NO_ZERO_DATE SQL मोड सक्षम करें।

अद्यतन करें

@ डिलन-सु द्वारा बताए गए बग मामले के बारे में:

मुझे नहीं लगता कि यह वह बग है जिस तरह से MYSQL उस समय विकसित हुआ है जिसके कारण उत्पाद के आगे सुधार के आधार पर कुछ चीजें बदली जाती हैं।

हालांकि मेरे पास NOW() फ़ंक्शन के संबंध में एक और संबंधित बग रिपोर्ट है

डेटाटाइम फ़ील्ड डिफ़ॉल्ट रूप से स्वीकार नहीं करता है ()

एक अन्य उपयोगी नोट [ स्वचालित प्रारंभिकरण और TIMESTAMP और DATETIME के ​​लिए अपडेट करना देखें]

MySQL 5.6.5, TIMESTAMP और DATETIME कॉलम के रूप में स्वचालित रूप से प्रारंभिक और वर्तमान दिनांक और समय (यानी, वर्तमान टाइमस्टैम्प) में अपडेट किया जा सकता है। 5.6.5 से पहले, यह केवल TIMESTAMP के लिए सही है, और प्रति तालिका अधिकतम एक TIMESTAMP कॉलम के लिए। निम्नलिखित नोट्स पहले स्वचालित प्रारंभिक वर्णन और MySQL 5.6.5 और ऊपर के लिए अद्यतन करने का वर्णन करते हैं, फिर 5.6.5 से पहले संस्करणों के लिए अंतर।

NO_ZERO_DATE के संबंध में अद्यतन करें

MySQL के रूप में 5.7.4 के रूप में इस मोड को बहिष्कृत किया गया है। पिछले संस्करण के लिए आपको कॉन्फ़िगरेशन फ़ाइल में संबंधित पंक्ति को टिप्पणी करनी होगी। NO_ZERO_DATE को MySQL 5.7 दस्तावेज़ देखें


यह 5.7.8 के लिए काम करता है:

mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc  |
+-----------+
1 row in set (0.00 sec)

आप अपनी समस्या को फिर से बनाने के लिए एक SQLFiddle बना सकते हैं।

http://sqlfiddle.com/

अगर यह MySQL 5.6 और 5.7.8 के लिए काम करता है, लेकिन 5.7.11 पर विफल रहता है। तो यह शायद 5.7.11 के लिए एक रिग्रेशन बग हो सकता है।


तिथि से डेटाटाइम में कनवर्ट करने का एक तरीका जिसका अभी तक उल्लेख नहीं किया गया है:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')




mysql sql date datetime console