Óðîê 5.14: Òðåáîâàíèÿ ñòîëáöîâ MySQL ê ïàìÿòè
Ãëàâíàÿ Ñòðàíèöà » Êíèãè ïî PHP » MySQL óðîêè äëÿ íà÷èíàþùèõ ñ íóëÿ » Òðåáîâàíèÿ ñòîëáöîâ MySQL ê ïàìÿòè
Âîò çäåñü íà÷èíàåòñÿ ñàìîå èíòåðåñíîå. Ñêîëüêî ïàìÿòè íóæíî äëÿ òîãî, ÷òîáû ñîõðàíèòü òî èëè èíîå çíà÷åíèå? Ýòî î÷åíü âàæíî, ïîòîìó ÷òî îøèáêà âñåãî íà îäèí áèò ïðèâåäåò ê ìíîãîìåãàáàéòíûì ïîòåðÿì íà áîëüøîé òàáëèöå: âåäü ýòîò ëèøíèé áèò ïîÿâèòñÿ â êàæäîé çàïèñè. Òðåáîâàíèÿ ê ïàìÿòè äëÿ êàæäîãî èç òèïîâ ñòîëáöîâ, ïîääåðæèâàåìûõ MySQL, ïåðå÷èñëåíû íèæå ñ ñîðòèðîâêîé ïî êàòåãîðèÿì.
Òèïû VARCHAR, BLOB è TEXT ïðåäñòàâëÿþò ñîáîé òèïû ïåðåìåííîé äëèíû, äëÿ êîòîðûõ òðåáîâàíèÿ ê ïàìÿòè çàâèñÿò îò ôàêòè÷åñêîé äëèíû çíà÷åíèÿ ñòîëáöà (ïðåäñòàâëåíà êàê L â ïîñëåäóþùèõ òàáëèöàõ). Íàïðèìåð, ñòîëáåö òèïà VARCHAR (10) ìîæåò õðàíèòü ñòðîêó ñ ìàêñèìàëüíîé äëèíîé â 10 ñèìâîëîâ. Ôàêòè÷åñêàÿ òðåáóåìàÿ ïàìÿòü ðàâíà äëèíå ñòðîêè (L) ïëþñ åùå 1 áàéò, ÷òîáû çàïèñàòü äëèíó ñòðîêè. Äëÿ ñòðîêè abed, L ðàâíî 4, à òðåáîâàíèÿ ê ïàìÿòè ðàâíû 5 áàéòàì.
Òèïû BLOB è TEXT òðåáóþò 1, 2, 3 èëè 4 áàéòà, ÷òîáû çàïèñàòü äëèíó çíà÷åíèÿ ñòîëáöà, â çàâèñèìîñòè îò ìàêñèìàëüíîé âîçìîæíîé äëèíû òèïà, à òàêæå ìåñòà ïîä ñàìî çíà÷åíèå (ñêîëüêî ïîíàäîáèòñÿ). Çàìåòèì, ÷òî ïî ïðè÷èíàì òåõíè÷åñêîãî ïëàíà, íà ñåãîäíÿøíèé äåíü â MySQL ìàêñèìàëüíàÿ äëèíà òèïîâ BLOB è TEXT îãðàíè÷åíà 16 ìåãàáàéòàìè, õîòÿ â áóäóùåì ýòî îãðàíè÷åíèå, âîçìîæíî, áóäåò ñíÿòî.
Åñëè òàáëèöà âêëþ÷àåò ëþáûå ñòîëáöû ïåðåìåííîé äëèíû, ôîðìàò çàïèñè áóäåò òàêæå ïåðåìåííîé äëèíû. Îáðàòèòå âíèìàíèå, ÷òî êîãäà òàáëèöà ñîçäàíà, MySQL ìîæåò, ïðè íåêîòîðûõ óñëîâèÿõ, òèõî è íåçàìåòíî èçìåíÿòü ñòîëáåö ñ òèïà ïåðåìåííîé äëèíû íà òèï ôèêñèðîâàííîé äëèíû. Âñå ïîäðîáíîñòè îá ýòîì ïðîöåññå ïðèâåäåíû â ðàçäåëå 7. «Ïîñòåïåííûå èçìåíåíèÿ ñïåöèôèêàöèè ñòîëáöà».
Ðàçìåð îáúåêòà ENUM îïðåäåëåí ÷èñëîì ðàçëè÷íûõ çíà÷åíèé ïåðå÷èñëåíèÿ. Îäèí áàéò èñïîëüçóåòñÿ äëÿ ïåðå÷èñëåíèÿ äî 255 âîçìîæíûõ çíà÷åíèé. Äâà áàéòà èñïîëüçóþòñÿ äëÿ ïåðå÷èñëåíèÿ äî 65535 çíà÷åíèé.
Ðàçìåð îáúåêòà SET òàêæå îïðåäåëåí ÷èñëîì ðàçëè÷íûõ ÷ëåíîâ íàáîðà. Åñëè ðàçìåð íàáîðà ðàâåí N, òî îáúåêò çàíèìàåò (N+7)/8 áàéò, îêðóãëåííûé äî 1, 2, 3, 4 èëè 8 áàéò â áîëüøóþ ñòîðîíó. Òèï SET ìîæåò èìåòü ìàêñèìóì äî 64 ÷ëåíîâ.
Òàáëèöà 5.7. Òðåáîâàíèÿ ê ïàìÿòè äëÿ ÷èñåë.
| Òèï ñòîëáöà | Äëÿ õðàíåíèÿ íàäî |
| TINYINT | 1 áàéò |
| SMALLINT | 2 áàéòà |
| MEDIUMINT | 3 áàéòà |
| INT | 4 áàéòà |
| INTEGER | 4 áàéòà |
| BIGINT | 8 áàéòà |
| FLOAT (X) | 4, åñëè X <= 24, èëè 8, åñëè 25 <= X <= 53 |
| FLOAT | 4 áàéòà |
| DOUBLE | 8 áàéòà |
| DOUBLE PRECISION | 8 áàéòà |
| REAL | 8 áàéòà |
| DECIMAL(M,D) | Ì+2 áàéò, åñëè D > 0, Ì+1 áàéò, åñëè D=0 (D+2, åñëè Ì < D) |
| NUMERIC(M,D) | Ì+2 áàéò, åñëè D > 0, Ì+1 áàéò, åñëè D=0 (D+2, åñëè Ì < D) |
Òàáëèöà 5.8. Òðåáîâàíèÿ ê ïàìÿòè äëÿ äàòû è âðåìåíè
| Òèï ñòîëáöà | Äëÿ õðàíåíèÿ íàäî |
| DATE | 3 áàéòà |
| DATETIME | 8 áàéòà |
| TIMESTAMP | 4 áàéòà |
| TIME | 3 áàéòà |
| YEAR | 1 áàéò |
| CHAR(M) | Ì áàéò, 1 <= Ì <= 255 |
| VARCHAR(Ì) | L+1 áàéò, ãäå L<=Ì è 1 <= Ì <= 255 |
| TINYTEXT, TINYBLOB | L+1 áàéò, ãäå L < 2^8 |
| BLOB, TEXT | L+2 áàéò, ãäå L < 2^16 |
| MEDIUMBLOB, MEDIUMTEXT | L+3 áàéò, ãäå L < 2^24 |
| LONGBLOB, LONGTEXT | L+4 áàéò, ãäå L < 2^32 |
| ENUM ("value1", 'value2', ...) | 1 èëè 2 áàéòà, â çàâèñèìîñòè îò êîëè÷åñòâà çíà÷åíèé ïåðå÷èñëåíèÿ (ìàêñèìóì 65535 çíà÷åíèé) |
| SET ("value1", 'value2', ...) | 1, 2, 3, 4 èëè 8 áàéò, â çàâèñèìîñòè îò ÷èñëà ÷ëåíîâ íàáîðà (ìàêñèìóì 64 ÷ëåíà) |



