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


124

मैं 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 का वही मामला।

एक संदेश के रूप में , यह MySQL डॉक्स में उल्लिखित है :

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

अगर वे भी कहते हैं:

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

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


11
आप ऐसा डिफ़ॉल्ट क्यों चाहते हैं जो स्पष्ट रूप से अर्थहीन हो? यदि तिथि अज्ञात है, तो वास्तव में यही NULLहै।
टॉम

नोट के रूप में: यह SQL Fiddle पर संस्करण 5.6 में काम करता है - sqlfiddle.com/# -9 / 02c98
गॉर्डन लिनोफ़

@Karlos अपडेटेड उत्तर की जाँच करें।
14

जवाबों:


209

त्रुटि sql मोड के कारण है जो नवीनतम MYSQL 5.7 प्रलेखन के अनुसार सख्त मोड हो सकता है

MySQL प्रलेखन 5.7 कहते हैं :

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

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

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

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

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

आज्ञा से

SET sql_mode = '';

या

SET GLOBAL sql_mode = '';

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

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

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

ध्यान दें

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

MySQL आपको "डमी डेट" के रूप में '0000-00-00' के "शून्य" मूल्य को स्टोर करने की अनुमति देता है। यह कुछ मामलों में NULL मानों का उपयोग करने से अधिक सुविधाजनक है, और कम डेटा और इंडेक्स स्पेस का उपयोग करता है। '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 के बारे में अपडेट करें

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


5
अद्यतन IGNORE मैं क्या देख रहा था ii
Kurakin

2
गलत। मेरे पास STRICT_TRANS_TABLESMySQL इंस्टेंस, लोकल और सर्वर दोनों हैं। हालाँकि, मैं आसानी 0000-00-00से अपने स्थानीय उदाहरण में सम्मिलित कर सकता हूं, लेकिन अपने सर्वर उदाहरण में नहीं कर सकता - त्रुटि फेंक दी गई है। क्यों? क्योंकि मेरा सर्वर MySQL config NO_ZERO_DATEसक्षम हो गया है। और मेरे स्थानीय के पास नहीं है।
ग्रीन

ok @Green मैं पता लगाऊंगा और यदि लागू हो तो उत्तर को अपडेट कर दूंगा
geeksal

4
मेरे मामले में 'SET sql_mode = ""' काम नहीं करता था। 'GLOBAL sql_mode = "" सेट करें? " मेरे लिए काम किया।
arjen स्टेंस

इसके अलावा NO_ZERO_DATEहटा दिया जाना चाहिए
Preshan Pradeepa

18

मेरे पास यह त्रुटि WAMP 3.0.6 के साथ MySql 5.7.14 के साथ थी।

समाधान :

c:\wamp\bin\mysql\mysql5.7.14\my.iniफ़ाइल में से 70 लाइन (यदि आपकी आईएन फाइल अनछुई है) को बदल दें

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सक्षम। प्रलेखन कहते हैं:

"MySQL 5.7 में डिफ़ॉल्ट SQL मोड में ये मोड शामिल हैं: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERRZ_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER_USER_USER_USER।


14

मैं ऐसी स्थिति में आ गया, जहां डेट फ़ील्ड के लिए NULL और 0000-00-00 के बीच डेटा मिलाया गया था। लेकिन मुझे नहीं पता था कि NULL को '0000-00-00' कैसे अपडेट करना है, क्योंकि

 update my_table set my_date_field=NULL where my_date_field='0000-00-00'

किसी भी अधिक की अनुमति नहीं है। मेरा वर्कअराउंड काफी सरल था:

update my_table set my_date_field=NULL where my_date_field<'1000-01-01'

क्योंकि सभी गलत my_date_fieldमूल्य (सही तारीखें हैं या नहीं) इस तारीख से पहले थे।


2
सही त्वरित समाधान। आप वास्तव में भी उपयोग कर सकते हैं <'0000-01-01'क्योंकि यह निश्चित रूप से एक वैध तारीख है।
रिकी मैकमास्टर

5

सिंटैक्स समस्या को कॉन्फ़िगर करें

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

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"

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

पानी का छींटा नहीं

sql-mode=NO_ENGINE_SUBSTITUTION

अंडरस्कोर कोई उद्धरण नहीं

sql_mode=NO_ENGINE_SUBSTITUTION

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

sql_mode="NO_ENGINE_SUBSTITUTION"

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

स्थायी Sql मोड फ़्लैग को कैसे सेटअप करें


5

पहले वर्तमान सत्र का चयन करें 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'

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

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 = '...';

4

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

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

फिर sudo service mysql restart


1
5.7.23 के लिए काम करता है।
user2513149

1
मैं शायद SELECT @@SESSION.sql_mode;सबसे पहले सुझाव दूंगा, और वे NO_ZERO_IN_DATE, NO_ZERO_DATE, और STRICT_TRANS_TABLES निकालते हैं जो आपको देता है। इस तरह से आपने जो भी अन्य सेटिंग्स सक्षम की थीं, उन्हें आप रख सकते हैं। मेरे पास अपने sql मोड के लिए निर्धारित उन दो वस्तुओं से बहुत अधिक था। पता नहीं वे सब क्या करते हैं, लेकिन मैं उन्हें इस बिंदु पर हटाने का जोखिम नहीं उठाना चाहता।
राडली सुस्टेयर

2

यह 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 के लिए प्रतिगमन बग हो सकता है।


1

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

वरीयताओं के पैनल में TRADITIONAL के लिए SQL_MODE निकालें।

यहां छवि विवरण दर्ज करें


1

यह जवाब यह सिर्फ 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, इससे पहले, मापदंडों की अनदेखी की जाएगी, इसलिए आपको इसे भी हटाने की आवश्यकता है।

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

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


0

के लिए विकल्प संयोजन mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)

फेंक नहीं है:

STRICT_TRANS_TABLES + NO_ZERO_DATE

फेंकता:

STRICT_TRANS_TABLES + NO_ZERO_IN_DATE

/etc/mysql/my.cnfउबंटू में मेरी सेटिंग :

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"


0

Diretory xamp / mysql / bin Open "my.ini" और परिवर्तन लाइन में: Sql_nit के लिए ->

"Sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"

याद रखें "NO_ZERO_IN_DATE"


स्टैकओवरफ़्लो में आपका स्वागत है, कृपया उत्तर की विरासत को बेहतर बनाने के लिए उचित कोड फ़ॉर्मेटिंग का उपयोग करें।
vlizana
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.