Óðîê 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 è ïðîàíàëèçèðîâàòü âòîðîé ñòîëáåö îïðåäåëåíèÿ.



