Íàâèãàöèÿ

Ïîèñê ïî Ñàéòó

Ïàðòíåðû

Ñàìîó÷èòåëü. Êíèãè.

Ñòàòèñòèêà

Óðîê 5.11: Ñòðîêîâûé òèï SET â MySQL

Ãëàâíàÿ Ñòðàíèöà » Êíèãè ïî PHP » MySQL óðîêè äëÿ íà÷èíàþùèõ ñ íóëÿ » Ñòðîêîâûé òèï SET

Áîëåå èíòåðåñíûé òèï SET ïðåäñòàâëÿåò ñîáîé ñòðîêîâûé îáúåêò, êîòîðûé ìîæåò èìåòü íîëü èëè áîëüøåå êîëè÷åñòâî çíà÷åíèé, êàæäîå èç êîòîðûõ äîëæíî áûòü âûáðàíî èç ñïèñêà äîïóñòèìûõ çíà÷åíèé, êîòîðûå ïåðå÷èñëåíû ÿâíî â ñïåöèôèêàöèè ñòîëáöà ïðè ñîçäàíèè òàáëèöû. Çíà÷åíèÿ ñòîëáöà SET, êîòîðûå ñîñòîÿò èç ìíîãèõ çíà÷åíèé íàáîðà, îïðåäåëåíû ÷ëåíàìè, îòäåëÿåìûìè çàïÿòûìè (,).  ñëåäñòâèå ýòîãî çíà÷åíèÿ ÷ëåíîâ SET íå ìîãóò ñàìîñòîÿòåëüíî ñîäåðæàòü çàïÿòûå.

Íàïðèìåð, ñòîëáåö, îïðåäåëåííûé êàê SET(«one», «two») NOT NULL , ìîæåò èìåòü ëþáîå èç ýòèõ çíà÷åíèé:

«»
«înå»
«two»
«one, two»

SET ìîæåò èìåòü ìàêñèìóì 64 ðàçëè÷íûõ ÷ëåíà.

MySQL ñîõðàíÿåò çíà÷åíèÿ SET â öèôðîâîé ôîðìå, ñ áèòîì ìëàäøåãî ðàçðÿäà ñîõðàíåííîãî çíà÷åíèÿ, ñîîòâåòñòâóþùåãî ïåðâîìó ÷ëåíó íàáîðà. Åñëè âû ïîëó÷àåòå çíà÷åíèå SET â ÷èñëîâîì êîíòåêñòå, îíî ïðåäñòàâëÿåò ñîáîé íàáîð áèòîâ, ñîîòâåòñòâóþùèé ÷ëåíàì íàáîðà, êîòîðûå ñîñòàâëÿþò çíà÷åíèå ñòîëáöà. Íàïðèìåð, âû ìîæåòå ïîëó÷èòü ÷èñëîâûå çíà÷åíèÿ èç ñòîëáöà SET ïîäîáíî ýòîìó:

mysql> SELECT set_col+0 FROM tbl_name;

Åñëè ÷èñëî ñîõðàíåíî â ñòîëáöå SET, áèòû, êîòîðûå óñòàíîâëåíû â äâîè÷íîì ïðåäñòàâëåíèè ÷èñëà, îïðåäåëÿþò ÷ëåíû íàáîðà â çíà÷åíèè ñòîëáöà.

Ïðåäïîëîæèì, ÷òî ñòîëáåö îïðåäåëåí êàê SET («à», «b», «c», «d»). ×ëåíû èìåþò ñëåäóþùèå ðàçðÿäíûå çíà÷åíèÿ (òàáë. 5.5):

Òàáëèöà 5.5. Ïðèìåð ñòîëáöà òèïà set

×ëåí ìíîæåñòâà SET Äåñÿòè÷íîå çíà÷åíèå Äâîè÷íîå çíà÷åíèå
a 1 0001
b 2 0010
c 4 0100
d 8 1000

Åñëè âû íàçíà÷àåòå ÷èñëî 9 ýòîìó ñòîëáöó (â äâîè÷íîé ñèñòåìå ýòî áóäåò 1001), òî ïåðâûé è ÷åòâåðòûé ÷ëåíû çíà÷åíèÿ SET (òî åñòü, «à» è «d») áóäóò âûáðàíû, è âîçíèêàþùèì â ðåçóëüòàòå çíà÷åíèåì áóäåò «à, d».

Äëÿ çíà÷åíèÿ, ñîäåðæàùåãî áîëüøå, ÷åì îäèí ýëåìåíò SET, íå èìååò çíà÷åíèÿ ïîðÿäîê ýëåìåíòîâ, â êîòîðîì îíè ïåðå÷èñëåíû, êîãäà âû âñòàâëÿåòå çíà÷åíèå. Òàêæå íå âàæíî, ñêîëüêî ðàç äàííûé ýëåìåíò ïåðå÷èñëåí â çíà÷åíèè. Êîãäà çíà÷åíèå ïîòîì áóäåò ïîëó÷åíî èç òàáëèöû, êàæäûé ýëåìåíò â íåì ïîÿâèòñÿ ëèøü îäíàæäû, ïðè÷åì ýëåìåíòû áóäóò ïåðå÷èñëåíû ñîãëàñíî ïîðÿäêó, â êîòîðîì îíè áûëè îïðåäåëåíû ïðè ñîçäàíèè òàáëèöû.

Íàïðèìåð, åñëè áûë ñòîëáåö îïðåäåëåí êàê SET («à», «Ü», «ñ», «d»), òî «à, d», «d, à» è «d, à, à, d, d» áóäóò ïîÿâëÿòüñÿ êàê «à, d» ïðè ïîëó÷åíèè äàííûõ èç òàáëèöû.

Çíà÷åíèÿ SET ñîðòèðóþòñÿ â öèôðîâîé ôîðìå. Òî åñòü ñíà÷àëà ýëåìåíòû ìíîæåñòâà ïðèâîäÿòñÿ ê èõ ÷èñëîâûì çíà÷åíèÿì â äâîè÷íîì âèäå, à óæ ïîòîì ñîðòèðóþòñÿ ðåçóëüòàòû ýòîé îïåðàöèè. Çíà÷åíèå NULL ðàñïîëîæèòñÿ ïåðåä äðóãèìè çíà÷åíèÿìè.

Îáû÷íî âû âûïîëíÿåòå SELECT íà ñòîëáöå SET, ïðèìåíÿÿ îïåðàòîð LIKE èëè ôóíêöèþ FIND_IN_SET():

mysql> SELECT * FROM tbl_name WHERE set_col LIKE "%value%";
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET("value",set_col)>0;

Íî ñëåäóþùåå òàêæå áóäåò ðàáîòàòü:

mysql> SELECT * FROM tbl_name WHERE set_col = "val1,val2";
mysql> SELECT * FROM tbl_name WHERE set_col & 1;;

Ïåðâàÿ èç ýòèõ èíñòðóêöèé èùåò òî÷íîå ñîîòâåòñòâèå. Âòîðàÿ èùåò çíà÷åíèÿ, ñîäåðæàùèå ïåðâûé ÷ëåí íàáîðà.

Åñëè âû õîòèòå óçíàòü âñå âîçìîæíûå çíà÷åíèÿ äëÿ ñòîëáöà SET, òî âû äîëæíû èñïîëüçîâàòü êîìàíäó SHOW COLUMNS FROM table_name LIKE set_column_name è ïðîàíàëèçèðîâàòü âòîðîé ñòîëáåö îïðåäåëåíèÿ.