Òèïû DATETIME, DATE è TIMESTAMP â MySQL
Ãëàâíàÿ Ñòðàíèöà » Êíèãè ïî PHP » MySQL óðîêè äëÿ íà÷èíàþùèõ ñ íóëÿ » Òèïû DATETIME, DATE è TIMESTAMP â MySQL
Òèïû DATETIME, DATE è TIMESTAMP ñâÿçàíû. Ýòîò ðàçäåë îïèñûâàåò èõ õàðàêòå¬ðèñòèêè è ðàçëè÷èÿ.
Òèï DATETIME èñïîëüçóåòñÿ, êîãäà âû íóæäàåòåñü â çíà÷åíèÿõ, ñîäåðæàùèõ èíôîðìàöèþ î äàòå è âðåìåíè. MySQL ïîëó÷àåò è îòîáðàæàåò çíà÷åíèÿ DATETIME â ôîðìàòå YYYY-MM-DD HH:MM:SS. Ïîääåðæèâàåìûé äèàïàçîí: îò 1000-01-01 00:00:00 äî 9999-12-31 23:59:59.
Òèï DATE èñïîëüçóåòñÿ, êîãäà âû íóæäàåòåñü òîëüêî â çíà÷åíèè äàòû, áåç çíà÷åíèÿ âðåìåíè. MySQL ïîëó÷àåò è îòîáðàæàåò çíà÷åíèÿ DATE â ôîðìàòå YYYY-MM-DD. Ïîääåðæèâàåìûé äèàïàçîí: îò 1000-01-01 äî 9999-12-31.
Òèï ñòîëáöà TIMESTAMP îáåñïå÷èâàåò òèï, êîòîðûé âû ìîæåòå èñïîëüçîâàòü, ÷òîáû àâòîìàòè÷åñêè îòìåòèòü îïåðàöèè INSERT èëè UPDATE òåêóùåé äàòîé è âðåìåíåì. Äëÿ ýòîãî ñëåäóåò ââåñòè â òàáëèöó ñòîëáåö òèïà TIMESTAMP. Òåïåðü ïðè ëþáîì îáíîâëåíèè çàïèñè, îí áóäåò àâòîìàòè÷åñêè óñòàíîâëåí â äàòó è âðåìÿ ìîäèôèêàöèè, ÷òî âåñüìà ïîëåçíî â öåëÿõ îòñëåæèâàíèÿ èçìåíåíèé. Åñëè âû èìååòå â òàáëèöå ìíîãî ñòîëáöîâ òèïà TIMESTAMP, òîëüêî ïåðâûé èç íèõ ìîäèôèöèðóåòñÿ àâòîìàòè÷åñêè.
Àâòîìàòè÷åñêîå ìîäèôèöèðîâàíèå ïåðâîãî ñòîëáöà TIMESTAMP ïðîèñõîäèò ïðè ëþáîì èç íèæå ïåðå÷èñëåííûõ óñëîâèé:
- ýòîò ñòîëáåö íå îïðåäåëåí ÿâíî â èíñòðóêöèè INSERT èëè LOAD DATA INFILE;
- ñòîëáåö íå îïðåäåëåí ÿâíî â èíñòðóêöèè UPDATE è íåêîòîðîì äðóãîì çíà÷åíèè èçìåíåíèé ñòîëáöà. Îáðàòèòå âíèìàíèå, ÷òî UPDATE, êîòîðûé óñòàíàâëèâàåò ñòîëáåö ê çíà÷åíèþ, óæå çàêðåïëåííîìó çà íèì, íå ïðèâåäåò ê ìîäèôèêàöèè ñòîëáöà òèïà TIMESTAMP, òàê êàê, åñëè âû óñòàíàâëèâàåòå ñòîëáåö ê òåêóùåìó çíà÷åíèþ, MySQL èãíîðèðóåò ìîäèôèêàöèþ äëÿ ïîâûøåíèÿ ýôôåêòèâíîñòè;
- âû ÿâíî óñòàíàâëèâàåòå ñòîëáåö òèïà TIMESTAMP â NULL.
Âòîðîé è ïîñëåäóþùèå ñòîëáöû òèïà TIMESTAMP òàêæå ìîãóò áûòü óñòàíîâëåíû ê òåêóùåé äàòå è âðåìåíè. Äëÿ ýòîãî óñòàíîâèòå ñîîòâåòñòâóþùèé ñòîëáåö â çíà÷åíèå NULL èëè â NOW().
Âû ìîæåòå óñòàíàâëèâàòü ëþáîé ñòîëáåö TIMESTAMP ê çíà÷åíèþ èíîìó, ÷åì òåêóùàÿ äàòà è âðåìÿ, óñòàíàâëèâàÿ ýòî çíà÷åíèå ÿâíî. Ýòî èñòèííî äàæå äëÿ ïåðâîãî ñòîëáöà TIMESTAMP. Âû ìîæåòå èñïîëüçîâàòü ýòî ñâîéñòâî, åñëè, íàïðèìåð, õîòèòå, ÷òîáû TIMESTAMP áûë óñòàíîâëåí ê òåêóùåé äàòå è âðåìåíè, êîãäà âû ñîçäàåòå ñòðîêó, íî íå èçìåíÿëñÿ â äàëüíåéøåì âñÿêèé ðàç, êîãäà ñòðîêà ìîäèôèöèðóåòñÿ:
- ïîçâîëüòå MySQL óñòàíîâèòü ñòîëáåö, êîãäà ñòðîêà ñîçäàíà. Ýòî èíèöèàëèçèðóåò ïåðåìåííóþ è óñòàíîâèò åå â òåêóùóþ äàòó è âðåìÿ;
- êîãäà âû âûïîëíÿåòå ïîñëåäóþùèå ìîäèôèêàöèè äðóãèõ ñòîëáöîâ â ñòðîêå, óñòàíîâèòå ñòîëáåö TIMESTAMP ÿâíî â íóæíîå çíà÷åíèå.
Çíà÷åíèÿ TIMESTAMP èìåþò òî÷íîñòü â îäíó ñåêóíäó. Çíà÷åíèÿ îòîáðàæàþòñÿ êàê ÷èñëà.
Ôîðìàò, â êîòîðîì MySQL ïîëó÷àåò è îòîáðàæàåò çíà÷åíèÿ TIMESTAMP, çàâè¬ñÿò îò ðàçìåðà îòîáðàæåíèÿ, êàê ïðîèëëþñòðèðîâàíî òàáë. 5.2. Ïîëíûé ôîðìàò TIMESTAMP ñîäåðæèò 14 öèôð, íî ñòîëáöû ìîãóò áûòü ñîçäàíû ñ áîëåå ìåëêèì ôîðìàòîì îòîáðàæåíèÿ:
Òàáëèöà 5.2. Ôîðìàò îòîáðàæåíèÿ ñòîëáöîâ TIMESTAMP.
| Òèï ñòîëáöà | Ôîðìàò îòîáðàæåíèÿ |
| TIMESTAMP (14) | YYYYMMDDHHMMSS |
| TIMESTAMP (12) | YYMMDDHHMMSS |
| TIMESTAMP (10) | YYMMDDHHMM |
| TIMESTAMP (8) | YYYYMMDD |
| TIMESTAMP (6) | YYMMDD |
| TIMESTAMP (4) | YYMM |
| TIMESTAMP (2) | YY |
Âñå ñòîëáöû òèïà TIMESTAMP èìåþò òîò æå ñàìûé ðàçìåð ïàìÿòè, íåçàâèñèìî îò ðàçìåðà îòîáðàæåíèÿ. Òî åñòü íà ñàìîì äåëå â òàáëèöå õðàíèòñÿ ïîëíîå çíà÷åíèå, à îòîáðàæåíèå îïðåäåëÿåò ëèøü òî, êàêàÿ ÷àñòü ïîëíîãî çíà÷åíèÿ áóäåò âàì ïîêàçàíà ïî çàïðîñó.
Íàèáîëåå ðàñïðîñòðàíåííûå ðàçìåðû: 6, 8, 12 è 14. Âû ìîæåòå îïðåäåëÿòü ïðîèçâîëüíûé ðàçìåð ïðè ñîçäàíèè òàáëèöû, íî çíà÷åíèÿ, ðàâíûå 0 èëè áîëüøå 14, áóäóò óñòàíîâëåíû êàê 14. Íå÷åòíûå ðàçìåðû â äèàïàçîíå îò 1 äî 13 áóäóò ïðèâåäåíû ê ñëåäóþùåìó ÷åòíîìó ÷èñëó.
Âû ìîæåòå îïðåäåëÿòü çíà÷åíèÿ DATETIME, DATE è TIMESTAMP, èñïîëüçóþùèå ëþáîé èç îáùåãî íàáîðà ôîðìàòîâ:
- ñòðîêà â ôîðìàòå YYYY-MM-DD HH:MM:SS èëè YY-MM-DD HH:MM:SS. Îáëåã÷åííûé ñèíòàêñèñ ïîçâîëÿåòñÿ: ëþáîé ñèìâîë ïóíêòóàöèè ìîæåò èñïîëüçîâàòüñÿ êàê ðàçäåëèòåëü ìåæäó ÷àñòÿìè äàòû èëè ÷àñòÿìè âðåìåíè. Íàïðèìåð, 98-12-31 11:30:45, 98.12.31 11+30+45, 98/12/31 11*30*45 è 98@12@31 11Ë30Ì5 ðàâíû;
- ñòðîêà â ôîðìàòå YYYY-MM-DD èëè YY-MM-DD. Îáëåã÷åííûé ñèíòàêñèñ ïîçâîëÿåòñÿ è çäåñü: íàïðèìåð, ñòðîêè 98-12-31, 98.12.31, 98/12/31 è 98@12@31 ÿâëÿþòñÿ ýêâèâàëåíòíûìè;
- ñòðîêà âîîáùå áåç ðàçäåëèòåëåé â ôîðìàòå YYYYMMDDHHMMSS èëè YYMMDDHHMMSS, ïðè óñëîâèè, ÷òî ñòðîêà èìååò ñìûñë êàê äàòà. Íàïðèìåð, 19970523091528 è 970523091528 èíòåðïðåòèðóþòñÿ êàê 1997-05-23 09:15:28, íî 971122129015 çàïðåùåí (èìååò íåïðàâèëüíóþ ìèíóòíóþ ÷àñòü) è ïðåâðàùàåòñÿ â 0000-00-00 00:00:00;
- ñòðîêà áåç ðàçäåëèòåëåé â ôîðìàòå YYYYMMDD èëè YYMMDD, ïðè óñëîâèè, ÷òî ñòðîêà èìååò ñìûñë êàê äàòà. Íàïðèìåð, 19970523 è 970523
- èíòåðïðåòèðóþòñÿ êàê 1997-05-23, íî 971332 çàïðåùåí (èìååò íåïðàâèëüíóþ ÷àñòü ìåñÿöà) è ñòàíîâèòñÿ 0000-00-00;
- ÷èñëî â ôîðìàòå YYYYMMDDHHMMSS èëè YYMMDDHHMMSS, ïðè óñëîâèè, ÷òî ÷èñëî èìååò ñìûñë êàê äàòà. Íàïðèìåð, 19830905132800 è 830905132800 èíòåðïðåòèðóþòñÿ êàê 1983-09-05 13:28:00;
- ÷èñëî â ôîðìàòå YYYYMMDD èëè YYMMDD ïðè óñëîâèè, ÷òî ÷èñëî èìååò ñìûñë êàê äàòà. Íàïðèìåð, 19830905 è 830905 èíòåðïðåòèðóþòñÿ êàê 1983-09-05;
- ðåçóëüòàò ôóíêöèè, êîòîðàÿ âîçâðàùàåò çíà÷åíèå, ïðèåìëåìîå â êîíòåêñòå DATETIME, DATE èëè TIMESTAMP, âðîäå NOW(), èëè CURRENT_DATE.
Çàïðåùåííûå çíà÷åíèÿ DATETIME, DATE èëè TIMESTAMP áóäóò ïðåîáðàçîâàíû â íóëåâîå çíà÷åíèå ñîîòâåòñòâóþùåãî òèïà (0000-00-00 00:00:00, 0000-00-00 èëè 00000000000000 ñîîòâåòñòâåííî).
Äëÿ çíà÷åíèé, îïðåäåëåííûõ êàê ñòðîêè, âêëþ÷àþùèå ðàçäåëèòåëè ÷àñòåé äàòû, íå òðåáóåòñÿ îïðåäåëÿòü äâå öèôðû äëÿ çíà÷åíèé ìåñÿöà èëè äíÿ, ìåíüøèõ, ÷åì 10: 1979-6-9, ýêâèâàëåíòíî 1979-06-09. Òî÷íî òàê æå äëÿ çíà÷åíèé, îïðåäåëåííûõ êàê ñòðîêè, êîòîðûå âêëþ÷àþò ðàçäåëèòåëè ÷àñòè âðåìåíè, íåîáÿçàòåëüíî îïðåäåëÿòü äâå öèôðû äëÿ çíà÷åíèé ÷àñà, ìèíóòû èëè ñåêóíäû, êîòîðûå ìåíüøå, ÷åì 10: 1979-10-30 1:2:3 çàäàåò òî æå ñàìîå, ÷òî è 1979-10-30 01:02:03.
Çíà÷åíèÿ, îïðåäåëåííûå êàê ÷èñëà, äîëæíû áûòü äëèíîé â á, 8,12 èëè 14 öèôð. Åñëè ÷èñëî äëèíîé â 8 èëè 14 öèôð, òî ñ÷èòàåòñÿ, ÷òî îíî â ôîðìàòå YYYYMMDD èëè YYYYMMDDHHMMSS, è ÷òî ãîä çàäàí ïåðâûìè 4 öèôðàìè. Åñëè ÷èñëî äëèíîé â á èëè 12 öèôð, ñ÷èòàåòñÿ, ÷òî îíî â ôîðìàòå YYMMDD èëè YYMMDDHHMMSS, è ÷òî ãîä çàäàí ïåðâûìè 2 öèôðàìè. ×èñëà, êîòîðûå íå ñîîòâåòñòâóþò ýòèì äëèíàì, äîïîëíÿþòñÿ íóëÿìè äî ñàìîé áëèçêîé äëèíû.
Çíà÷åíèÿ, îïðåäåëåííûå êàê íåðàçãðàíè÷åííûå ñòðîêè èíòåðïðåòèðóþòñÿ, ñîãëàñíî èõ äëèíå, êàê îíà åñòü. Ýòî îçíà÷àåò, ÷òî âû íå äîëæíû èñïîëüçîâàòü ñòðîêè êîðî÷å øåñòè ñèìâîëîâ. Íàïðèìåð, åñëè âû îïðåäåëÿåòå 9903, äóìàÿ, ÷òî ïðåäñòàâèòå ìàðò 1999 ãîäà, âû î÷åíü ñêîðî íàéäåòå, ÷òî MySQL ïîäñòàâëÿåò íîëü äëÿ äàòû â âàøó òàáëèöó. Ýòî ïîòîìó, ÷òî çíà÷åíèÿ ãîäà è ìåñÿöà 99 è 03, íî ÷àñòü äíÿ ïðîïóùåíà, òàê ÷òî çíà÷åíèå íå ÿâëÿåòñÿ äîïóñòèìîé äàòîé. Âåçäå ïðèìåíÿåòñÿ ôîðìàò ãîä-ìåñÿö-äåíü.
Ñòîëáöû TIMESTAMP ñîõðàíÿþò äîïóñòèìûå çíà÷åíèÿ, èñïîëüçóÿ òî÷íîñòü, ñ êîòîðîé çíà÷åíèå áûëî îïðåäåëåíî, íåçàâèñèìî îò ðàçìåðà îòîáðàæåíèÿ. Ïîýòîìó:
- âñåãäà îïðåäåëÿéòå ãîä, ìåñÿö è äåíü, äàæå åñëè âàø òèï ñòîëáöà TIMESTAMP(4) èëè TIMESTAMP(2). Èíà÷å, çíà÷åíèå íå áóäåò äîïóñòèìîé äàòîé, à áóäåò ñîõðàíåí 0;
- åñëè âû èñïîëüçóåòå ALTER TABLE (îáñóæäàåòñÿ ïîçæå), ÷òîáû ðàñøèðèòü óçêèé ñòîëáåö TIMESTAMP, íà÷íåò îòîáðàæàòüñÿ òà èíôîðìàöèÿ, êîòîðàÿ ðàíüøå áûëà ñêðûòà. Òî åñòü ýòà èíôîðìàöèÿ â ñòîëáöå åñòü (è âñåãäà áûëà), íî íå ïîêàçûâàëàñü èç-çà ðàçìåðà îòîáðàæåíèÿ!
- òî÷íî òàê æå ñóæåíèå ñòîëáöà TIMESTAMP íå óíè÷òîæèò èíôîðìàöèþ, ïðîñòî ìåíüøåå êîëè÷åñòâî èíôîðìàöèè áóäåò ïîêàçûâàòüñÿ, êîãäà îòîáðàæàþòñÿ çíà÷åíèÿ ñòîëáöà. Íî çíà÷åíèå âñå ðàâíî õðàíèòñÿ ïîëíîñòüþ;
- õîòÿ çíà÷åíèÿ TIMESTAMP ñîõðàíåíû ñî âñåé òî÷íîñòüþ, òîëüêî ôóíêöèÿ UNIX_TIMESTAMP() ðàñïðîñòðàíÿåòñÿ íåïîñðåäñòâåííî íà îñíîâíîå ñîõðàíåííîå çíà÷åíèå. Äðóãèå ôóíêöèè èìåþò äåëî ñ ôîðìàòèðóåìûì çíà÷åíèåì. Âû íå ìîæåòå èñïîëüçîâàòü ôóíêöèè òèïà HOUR() èëè SECOND(), åñëè ðåëåâàíòíàÿ ÷àñòü çíà÷åíèÿ TIMESTAMP íå âêëþ÷åíà â ôîðìàòèðóåìîå çíà÷åíèå (îíè ïîëó÷àþò äàííûå ñ ó÷åòîì ðàçìåðà îòîáðàæåíèÿ, à çíà÷èò, ïðîñòî íå óâèäÿò íóæíûõ äàííûõ). Íàïðèìåð, ÷àñòü ÍÍ ñòîëáöà TIMESTAMP íå îòîáðàæàåòñÿ, åñëè ðàçìåð îòîáðàæåíèÿ ìåíüøå 10. Ïðè÷åì íå îòîáðàæàåòñÿ íå òîëüêî äëÿ ïîëüçîâàòåëÿ, íî è äëÿ âíóòðåííèõ ôóíêöèé ñàìîãî ñåðâåðà.
Âû ìîæåòå äî íåêîòîðîé ñòåïåíè íàçíà÷àòü çíà÷åíèÿ îäíîãî òèïà äàòû îáúåêòó èíîãî òèïà äàòû. Îäíàêî, ìîæåò èìåòüñÿ íåêîòîðîå èçìåíåíèå çíà÷åíèÿ èëè ïîòåðÿ èíôîðìàöèè ïðè òàêîì ïîäõîäå:
- åñëè âû íàçíà÷àåòå çíà÷åíèå DATE îáúåêòó DATETIME èëè TIMESTAMP, ÷àñòü âðåìåíè, âîçíèêàþùåãî â ðåçóëüòàòå çíà÷åíèÿ áóäåò óñòàíîâëåíà â 00:00:00 ïîòîìó, ÷òî çíà÷åíèå DATE íå ñîäåðæèò èíôîðìàöèþ äëÿ âðåìåíè;
- åñëè âû óñòàíàâëèâàåòå äëÿ îáúåêòà DATE çíà÷åíèå DATETIME èëè TIMESTAMP, çíà÷åíèÿ âðåìåíè óäàëÿþòñÿ, ïîòîìó ÷òî òèï DATE íå ñîõðàíÿåò èíôîðìàöèþ î âðåìåíè;
- íå çàáóäüòå, ÷òî, õîòÿ DATETIME, DATE è TIMESTAMP ìîãóò áûòü îïðåäåëåíû ñ èñïîëüçîâàíèåì òîãî æå ñàìîãî íàáîðà ôîðìàòîâ, îíè èìåþò ðàçíûé äèàïàçîí çíà÷åíèé. Íàïðèìåð, çíà÷åíèå. TIMESTAMP íå ìîæåò áûòü ðàíåå, ÷åì 1970, èëè ïîçæå, ÷åì 2037. Ýòî îçíà÷àåò, ÷òî äàòà òèïà 1968-01-01, êîòîðàÿ âïîëíå íîðìàëüíà äëÿ DATETIME èëè DATE, íåäîïóñòèìà äëÿ ïåðåìåííîé òèïà TIMESTAMP è ïðåâðàòèòñÿ â 0.  îáùåì, áóäüòå îñìîòðèòåëüíû!
Çíàéòå íåêîòîðûå ëîâóøêè ïðè îïðåäåëåíèè çíà÷åíèé äàòû:
- îñëàáëåííûé èëè óïðîùåííûé ôîðìàò, äîïóñòèìûé äëÿ çíà÷åíèé, îïðåäåëåííûõ êàê ñòðîêè, áåçóñëîâíî, õîðîø è óäîáåí, íî ìîæåò îáìàíûâàòü. Íàïðèìåð, çíà÷åíèå òèïà 10:11:12 ìîãëî áû íàïîìèíàòü çíà÷åíèå âðåìåíè èç-çà ðàçäåëèòåëÿ, íî åñëè îíî èñïîëüçóåòñÿ â êîíòåêñòå äàòû, òî áóäåò èíòåðïðåòèðîâàòüñÿ êàê ãîä 2010-11-12. Çíà÷åíèå 10:45:15 áóäåò ïðåîáðàçîâàíî â 0000-00-00 ïîòîìó, ÷òî 45 çàäàåò íåäîïóñòèìûé ìåñÿö;
- çíà÷åíèÿ ãîäà, îïðåäåëåííûå êàê äâå öèôðû, íåîäíîçíà÷íû ïîòîìó, ÷òî ñòîëåòèå íåèçâåñòíî. MySQL èíòåðïðåòèðóåò èõ òàê, êàê ðàññêàçàíî âûøå.



