ऐसा लगता है कि इस प्रश्न का संक्षिप्त उत्तर "नहीं, यह सुरक्षित नहीं है" - यह निष्कर्ष MySQL शेल के साथ प्रयोगों की एक श्रृंखला का अनुसरण करता है। फिर भी अधिक "सैद्धांतिक" उत्तर की सराहना करेंगे, हालांकि...
स्पष्ट रूप से MySQL इंजन (डिफ़ॉल्ट रूप से) बहुत उदार है जो इसे sql_mode
के साथ भी डेटाटाइम शाब्दिक के रूप में स्वीकार करता है। STRICT_ALL_TABLES पर सेट करें:न केवल विभिन्न विभाजक स्वीकार किए जाते हैं, वे भिन्न भी हो सकते हैं:
INSERT INTO t(dt) VALUES('2012-01,03.04:[email protected]'); -- Query OK, 1 row affected
इसके अलावा, यदि स्ट्रिंग बहुत छोटी है, तो यह शून्य से गद्दीदार हो जाएगी... लेकिन आश्चर्य हो सकता है:
INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what's inserted
दुखद बात यह है कि स्ट्रिंग बहुत लंबी है (जब अंतिम पार्स करने योग्य अंक के बाद व्हाइटस्पेस के अलावा कुछ और होता है) को सख्त मोड में अमान्य मान माना जाएगा:
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
ERROR 1292 (22007): Incorrect datetime value: '2012-06-27T05:25Z' for column 'dt' at row 1
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25');
Query OK, 1 row affected (0.10 sec)
पारंपरिक मोड में पार्सिंग और भी अधिक आराम से होती है - लेकिन अधिक सटीक नहीं; इसके अलावा, सख्त मोड में गलत माने जाने वाले स्ट्रिंग्स 'मूक चेतावनियां' देंगे, हालांकि ऑपरेशन सफल होंगे:
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
Query OK, 1 row affected, 1 warning (0.10 sec)
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'dt' at row 1 |
+---------+------+---------------------------------------------+
mysql> SELECT dt FROM t;
+---------------------+
| dt |
+---------------------+
| 2012-06-27 05:25:00 |
+---------------------+
निचली पंक्ति यह है कि हमें कुछ डीएएल-संबंधित कोड को फिर से लिखना पड़ा ताकि तिथियां (और डेटाटाइम) हमेशा "सामान्यीकृत" रूप में डीबी को भेजी जा सकें। मुझे आश्चर्य है कि हमें ऐसा क्यों करना है, न कि Zend_Db डेवलपर्स। लेकिन यह एक और कहानी है, मुझे लगता है। )