MySQL 5.6 डेटाइम गलत डेटाइम मान: '2013-08-25T17: 00: 00 + 00: 00' त्रुटि कोड 1292 के साथ


15

मैं MySQL 5.6 का उपयोग कर रहा हूं और मेरे पास एक प्रोग्राम है जो मेरे डेटाबेस के खिलाफ निम्न एसक्यूएल स्टेटमेंट चलाता है:

UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123' 

अनुचित रूप से, मुझे निम्नलिखित त्रुटि मिलती है: गलत डेटाइम मान: '2013-08-25T17: 00: 00 + 00: 00' पंक्ति में कॉलम 's_time' के लिए

S_time के लिए डेटाटाइप डेटटाइम है।

मैंने पहले ही कार्यक्षेत्र का उपयोग करके allow_invalid_dates संपत्ति सेट करने का प्रयास किया है।

क्या कोई मुझे समझ सकता है और कृपया मुझे इस त्रुटि की व्याख्या करें? मुझे पता है कि अगर मैं मैन्युअल रूप से अपडेट को स्टेट m_tableसेट में बदलता हूंs_time = '2013-08-25 17:00:00' WHERE id = '123' में , तो स्टेटमेंट काम करता है।

दुर्भाग्य से, मैं उस प्रोग्राम को संशोधित नहीं कर सकता जो एसक्यूएल स्टेटमेंट की आपूर्ति करता है (जो मुझे बताया गया है कि प्रोग्राम के निर्माता द्वारा मान्य है) और मैं यह भी नहीं समझ सकता कि +00: 00 का प्रतीक क्या है।

धन्यवाद

जवाबों:


24
'2013-08-25T17:00:00+00:00'

यह एक मान्य iso-8601 डेटाटाइम मान है, लेकिन यह मान्य MySQL डेटाटाइम शाब्दिक नहीं है । उस बिंदु पर, डेवलपर गलत है।

प्रलेखन बताते हैं क्या ALLOW_INVALID_DATESकरता है:

केवल यह जांचें कि महीना 1 से 12 तक की सीमा में है और दिन 1 से 31 की सीमा में है।

दूसरे शब्दों में, 2013-02-31यदि allow_invalid_datesसेट किया गया है तो एक स्वीकार्य तारीख होगी । यह विकल्प कुछ भी नहीं करता है जब तारीख या डेटाइम भी MySQL के लिए एक वैध प्रारूप में नहीं है।

+00:00समय क्षेत्र से ऑफसेट है यूटीसी । इस मामले में, व्यक्त समय अंदर है , यूटीसी तो ऑफसेट शून्य घंटे, शून्य मिनट है।

MySQL 5.6 स्थापना प्रक्रिया के दौरान बनाई गई कॉन्फ़िग फ़ाइल में डिफ़ॉल्ट रूप STRICT_TRANS_TABLESसे उस पर से हटाने के लिए आपका वर्कअराउंड होगा sql_mode... आपको इसे बदलने के निहितार्थ पर सावधानीपूर्वक विचार करने की आवश्यकता है, लेकिन यह डेटा को अंदर जाने की अनुमति देता है।

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
ERROR 1292 (22007): Incorrect datetime value: '2013-08-26T12:00:00+00:00' for column 'dt' at row 1

-- remove STRICT_TRANS_TABLES -- note that executing this only removes it for your
-- current session -- it does not make a server-wide config change

mysql> set @@sql_mode='no_engine_substitution';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+------------------------+
| @@sql_mode             |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

-- now MySQL will accept the invalid value, with a warning

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'dt' at row 1 |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)

-- the value did get inserted, but the time zone information was lost:

mysql> select * from datetimetest;
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  1 | 2013-08-26 12:00:00 |
+----+---------------------+
1 row in set (0.00 sec)

धन्यवाद। अंत में मैंने प्रोग्रामर को MySQL मानक को पूरा करने के लिए SQL कथन बनाने वाले PHP कोड को बदलने के लिए कहा है, लेकिन यह एक दिलचस्प बदलाव है। अजीब बात यह है कि मूल SQL स्टेटमेंट पुराने MySQL संस्करणों में काम करता है।
एंड्रयू

2
भी शामिल है STRICT_TRANS_TABLESएक डिफ़ॉल्ट विन्यास फाइल में केवल MySQL 5.6 है, जो व्यवहार में बदलाव बताते हैं ... अगर आपने उसे सक्षम में पेश किया गया था SQL_MODEपिछले संस्करणों में, क्वेरी भी उन संस्करणों में टूट जाएगा।
माइकल - sqlbot

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