×èñëîâûå òèïû â MySQL
Ãëàâíàÿ Ñòðàíèöà » Êíèãè ïî PHP » MySQL óðîêè äëÿ íà÷èíàþùèõ ñ íóëÿ » ×èñëîâûå òèïû â MySQL
MySQL ïîääåðæèâàåò âñå ÷èñëîâûå òèïû ANSI SQL92. Ýòè òèïû âêëþ÷àþò òî÷íûå ÷èñëîâûå òèïû äàííûõ (NUMERIC, DECIMAL, INTEGER è SMALLINT), à òàêæå ïðèáëèçèòåëüíûå ÷èñëîâûå òèïû äàííûõ (FLOAT, REAL è DOUBLE PRECISION). Êëþ÷åâîå ñëîâî INT ïðåäñòàâëÿåò ñîáîé ñèíîíèì äëÿ INTEGER, à êëþ÷åâîå ñëîâî DEC ÿâëÿåòñÿ ñèíîíèìîì äëÿ DECIMAL.
Òèïû NUMERIC è DECIMAL âûïîëíåíû êàê òîò æå ñàìûé òèï MySQL, òàê ðàçðåøåíî ñòàíäàðòîì SQL92. Îíè èñïîëüçóþòñÿ äëÿ çíà÷åíèé, äëÿ êîòîðûõ âàæíî ñîõðàíèòü èäåàëüíóþ òî÷íîñòü, íàïðèìåð äëÿ ðàáîòû ñ ôèíàíñîâûìè äàííûìè. Ïðè îáúÿâëåíèè ñòîëáöà îäíîãî èç ýòèõ òèïîâ òî÷íîñòü è ìàñøòàá ìîãóò áûòü (è îáû÷íî áûâàþò) îïðåäåëåíû, íàïðèìåð:
salary DECIMAL(9,2)
 ýòîì ïðèìåðå 9 (òî÷íîñòü, precision) ïðåäñòàâëÿåò ÷èñëî çíà÷àùèõ äåñÿòè÷íûõ öèôð, êîòîðûå áóäóò ñîõðàíåíû äëÿ çíà÷åíèé, à 2 (ìàñøòàá, scale) ïðåäñòàâëÿåò ÷èñëî öèôð, êîòîðûå áóäóò ñîõðàíåíû ïîñëå äåñÿòè÷íîé îòìåòêè.  ýòîì ñëó÷àå, ñëåäîâàòåëüíî, äèàïàçîí çíà÷åíèé, êîòîðûå ìîãóò áûòü ñîõðàíåíû â ñòîëáöå salary, - îò -9999999.99 äî 9999999.99 (MySQL ìîæåò ôàêòè÷åñêè ñîõðàíÿòü ÷èñëà äî 9999999.99 â ýòîì ñòîëáöå, ïîòîìó ÷òî íå òðåáóåòñÿ ñîõðàíÿòü çíàê äëÿ ïîëîæèòåëüíûõ ÷èñåë).
 ANSI SQL92 ñèíòàêñèñ DECIMAL(p) ýêâèâàëåíòåí DECIMAL(p,0). Òî÷íî òàê æå ñèíòàêñèñ DECIMAL ÿâëÿåòñÿ ýêâèâàëåíòíûì DECIMAL(p,0), ãäå ðåàëèçàöèè ïîçâîëÿþò ìåíÿòü çíà÷åíèå p. MySQL â íàñòîÿùåå âðåìÿ íå ïîääåðæèâàåò íè îäíó èç ýòèõ ðàçëè÷íûõ ôîðì òèïîâ äàííûõ DECIMAL/NUMERIC. Îäíàêî ñåðüåçíîé ïðîáëåìû çäåñü íåò, ïîñêîëüêó ïðèíöèïèàëüíûå âûãîäû ýòèõ òèïîâ ïðîèñõîäÿò îò ñïîñîáíîñòè óïðàâëÿòü òî÷íîñòüþ è ìàñøòàáîì ÿâíî.
Çíà÷åíèÿ òèïîâ DECIMAL è NUMERIC ñîõðàíåíû êàê ñòðîêè, à íå êàê äâîè÷íûå ÷èñëà ñ ïëàâàþùåé çàïÿòîé, ÷òîáû ñîõðàíèòü äåñÿòè÷íóþ òî÷íîñòü çíà÷åíèé. Îäèí ñèìâîë èñïîëüçóåòñÿ äëÿ êàæäîé öèôðû çíà÷åíèÿ, äåñÿòè÷íîé îòìåòêè (åñëè scale > 0) è çíàêà ìèíóñ (äëÿ îòðèöàòåëüíûõ ÷èñåë). Åñëè scale ðàâåí 0, çíà÷åíèÿ DECIMAL è NUMERIC íå ñîäåðæàò íèêàêîé äåñÿòè÷íîé îòìåòêè èëè äðîáíîé ÷àñòè.
Ìàêñèìàëüíûé äèàïàçîí çíà÷åíèé DECIMAL è NUMERIC àíàëîãè÷åí äèàïàçîíó äëÿ DOUBLE, íî ôàêòè÷åñêèé äèàïàçîí äëÿ äàííîãî ñòîëáöà DECIMAL èëè NUMERIC ìîæåò áûòü îãðàíè÷åí òî÷íîñòüþ èëè ìàñøòàáîì äëÿ äàííîãî ñòîëáöà. Êîãäà òàêîé ñòîëáåö íàçíà÷åí, çíà÷åíèå ñ áîëüøèì êîëè÷åñòâîì öèôð ïîñëå äåñÿòè÷íîé îòìåòêè, ÷åì ïîçâîëÿåò îïðåäåëåííûé ìàñøòàá, áóäåò îêðóãëåíî äî çàäàííîãî ìàñøòàáà. Êîãäà ïðîèñõîäèò ïåðåïîëíåíèå (ñòîëáöó ïðèñâàèâàåòñÿ çíà÷åíèå, ïðåâûøàþùåå åãî äèàïàçîí), MySQL ñîõðàíÿåò çíà÷åíèå, ïðåäñòàâëÿþùåå ñîîòâåòñòâóþùèé ìàêñèìóì ýòîãî äèàïàçîíà.
MySQL ïîääåðæèâàåò êàê ðàñøèðåíèå ñòàíäàðòà ANSI SQL92 âñòðîåííûå òèïû TINYINT, MEDIUMINT è BIGINT, êàê ïåðå÷èñëåíî âûøå. Äðóãîå ðàñøèðåíèå ðåàëèçîâàíî MySQL äëÿ ôàêóëüòàòèâíîãî îïðåäåëåíèÿ øèðèíû îòîáðàæåíèÿ çíà÷åíèÿ â êðóãëûõ ñêîáêàõ ïîñëå îñíîâíîãî êëþ÷åâîãî ñëîâà äëÿ òèïà (íàïðèìåð, INT(4)).
Ýòà ôàêóëüòàòèâíàÿ ñïåöèôèêàöèÿ øèðèíû èñïîëüçóåòñÿ äëÿ âûâîäà çíà÷åíèé, øèðèíà êîòîðûõ ìåíüøå, ÷åì øèðèíà, îïðåäåëåííàÿ äëÿ ñòîëáöà, íî íå ñäåðæèâàåò äèàïàçîí çíà÷åíèé, êîòîðûå ìîãóò áûòü ñîõðàíåíû â ñòîëáöå, èëè ÷èñëî öèôð, êîòîðûå áóäóò îòîáðàæàòüñÿ äëÿ çíà÷åíèé, ÷üÿ øèðèíà ïðåâûøàåò çàäàííóþ.
Êîãäà óêàçàíèå øèðèíû èñïîëüçóåòñÿ âìåñòå ñ ôàêóëüòàòèâíûì àòðèáóòîì ZEROFILL (çàïîëíèòü íóëÿìè), äîïîëíåíèå çíà÷åíèÿ ïî óìîë÷àíèþ ïðîáåëàìè áóäåò çàìåíåíî íà íóëè.
Íàïðèìåð, äëÿ ñòîëáöà, îáúÿâëåííîãî êàê INT(5) ZEROFILL, çíà÷åíèå 4 ïðåâðàòèòñÿ â 00004, 36 ïðåäñòàâëÿåòñÿ êàê 00036, à 12345 êàê 12345 áåç âñÿêèõ äîïîëíåíèé.
Îáðàòèòå âíèìàíèå, ÷òî, åñëè âû ñîõðàíÿåòå çíà÷åíèÿ áîëüøèå, ÷åì øèðèíà îòîáðàæåíèÿ â öåëî÷èñëåííîì ñòîëáöå, ó âàñ ìîãóò âîçíèêíóòü ïðîáëåìû, êîãäà MySQL ãåíåðèðóåò âðåìåííûå òàáëèöû äëÿ íåêîòîðûõ ñëîæíûõ îáúåäèíåíèé, ïîñêîëüêó â ýòèõ ñëó÷àÿõ MySQL «ïîëàãàåò», ÷òî äàííûå âïèñûâàëèñü â ïåðâîíà÷àëüíóþ øèðèíó ñòîëáöà.
Âñå âñòðîåííûå òèïû ìîãóò èìåòü ôàêóëüòàòèâíûé àòðèáóò UNSIGNED (áåç çíàêà). Çíà÷åíèÿ áåç çíàêà ìîãóò èñïîëüçîâàòüñÿ, êîãäà âû õîòèòå ïîçâîëèòü ïðèìåíåíèå òîëüêî ïîëîæèòåëüíûõ ÷èñåë â ñòîëáöå, è íóæäàåòåñü â íåñêîëüêî áîëüøåì ÷èñëîâîì äèàïàçîíå ñòîëáöà.
Òèï FLOAT èñïîëüçóåòñÿ, ÷òîáû ïðåäñòàâèòü ïðèáëèçèòåëüíûå ÷èñëîâûå òèïû äàííûõ. Ñòàíäàðò ANSI SQL92 ïîçâîëÿåò ôàêóëüòàòèâíóþ ñïåöèôèêàöèþ òî÷íîñòè (íî íå äèàïàçîí) â áèòàõ ïîñëå êëþ÷åâîãî ñëîâà FLOAT â êðóãëûõ ñêîáêàõ. MySQL-ðåàëèçàöèÿ òàêæå ïîääåðæèâàåò ýòó ôàêóëüòàòèâíóþ ñïåöèôèêàöèþ òî÷íîñòè. Êîãäà êëþ÷åâîå ñëîâî FLOAT èñïîëüçóåòñÿ äëÿ òèïà ñòîëáöà áåç ñïåöèôèêàöèè òî÷íîñòè, MySQL ïðèìåíÿåò ÷åòûðå áàéòà, ÷òîáû ñîõðàíèòü çíà÷åíèÿ.
Òàêæå äîïóñòèì ñèíòàêñèñ ñ äâóìÿ ÷èñëàìè, çàäàííûìè â êðóãëûõ ñêîáêàõ, ïîñëå êëþ÷åâîãî ñëîâà FLOAT.  ýòîé ñèòóàöèè ïåðâîå ÷èñëî ïðîäîëæàåò ïðåäñòàâëÿòü òðåáîâàíèÿ ê ïàìÿòè äëÿ çíà÷åíèÿ â áàéòàõ, à âòîðîå îïðåäåëÿåò ÷èñëî öèôð, êîòîðûå áóäóò ñîõðàíåíû è îòîáðàçÿòñÿ ïîñëå äåñÿòè÷íîé îòìåòêè (êàê ñ DECIMAL è NUMERIC). Êîãäà MySQL íóæíî ñîõðàíèòü ÷èñëî äëÿ òàêîãî ñòîëáöà ñ áîëüøèì êîëè÷åñòâîì öèôð ïîñëå äåñÿòè÷íîé îòìåòêè, ÷åì îïðåäåëåíî äëÿ ñòîëáöà, çíà÷åíèå áóäåò àâòîìàòè÷åñêè îêðóãëåíî, ÷òîáû óñòðàíèòü ëèøíèå öèôðû. Èìåéòå â âèäó îøèáêè îêðóãëåíèÿ!
Òèïû REAL è DOUBLE PRECISION íå ïðèíèìàþò ñïåöèôèêàöèè òî÷íîñòè.  êà÷åñòâå äîïîëíåíèÿ ê ñòàíäàðòó ANSI SQL92 MySQL ðàñïîçíàåò DOUBLE êàê ñèíîíèì äëÿ DOUBLE PRECISION.  îòëè÷èå îò òðåáîâàíèÿ ñòàíäàðòà, MySQL ðåàëèçóåò òî è äðóãîå êàê 8-áàéòíûå çíà÷åíèÿ äâîéíîé òî÷íîñòè ñ ïëàâàþùåé òî÷êîé. Ýòî ñäåëàíî äëÿ òîãî, ÷òîáû òî÷íîñòü äëÿ REAL áûëà ìåíüøå, ÷åì èñïîëüçóåìàÿ äëÿ DOUBLE PRECISION.
Êîãäà íóæíî ñîõðàíèòü â ÷èñëîâîì ñòîëáöå çíà÷åíèå, êîòîðîå âûõîäèò çà äèàïàçîí, MySQL óñåêàåò çíà÷åíèå äî ñîîòâåòñòâóþùåé ãðàíèöû äèàïàçîíà è ñîõðàíÿåò âîçíèêàþùåå â ðåçóëüòàòå çíà÷åíèå.
Íàïðèìåð, äèàïàçîí ñòîëáöà INT îò -2147483648 äî 2147483647. Åñëè âû ïðîáóåòå âñòàâëÿòü ÷èñëî -9999999999 â ñòîëáåö òèïà INT, çíà÷åíèå áóäåò óñå÷åíî äî íèæíåé ãðàíèöû äèàïàçîíà è ñîõðàíåíî -2147483648. Òî÷íî òàê æå, åñëè âû ïðîáóåòå âñòàâèòü 9999999999, âìåñòî ýòîãî áóäåò ñîõðàíåíî òîëüêî 2147483647.
Åñëè ñòîëáåö INT îïðåäåëåí êàê UNSIGNED, ðàçìåð äèàïàçîíà ñòîëáöà òîò æå ñàìûé, íî ïðîèçîéäåò ñäâèã çíà÷åíèé íà 0 è 4294967295. Åñëè âû ïðîáóåòå ñîõðàíÿòü -9999999999 è 9999999999, çíà÷åíèÿ, ñîõðàíåííûå â ñòîëáöå, ñòàíóò ñîîòâåòñòâåííî 0 è 4294967296.
Ïðåîáðàçîâàíèÿ, êîòîðûå ïðîèñõîäÿò èç-çà óñå÷åíèÿ, ñîîáùàþòñÿ êàê warning äëÿ èíñòðóêöèé LOAD DATA INFILE, UPDATE è ìíîãîñòðî÷íîãî âàðèàíòà INSERT (áîëåå ïîäðîáíî ýòè èíñòðóêöèè ðàññìàòðèâàþòñÿ ïîçäíåå, à ïîêà çàïîìíèòå, ÷òî ïðè èõ âûïîëíåíèè ìîæíî óâèäåòü ñëîâî warning ñ ïîÿñíåíèÿìè).



