• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            mysql中的set類型

            SET是一個字符串對象,可以有零或多個值,其值來自表創(chuàng)建時規(guī)定的允許的一列值。指定包括多個SET成員的SET列值時各成員之間用逗號(‘,’)間隔開。這樣SET成員值本身不能包含逗號。

            例如,指定為SET('one', 'two') NOT NULL的列可以有下面的任何值:

            ''

            'one'

            'two'

            'one,two'

            SET最多可以有64個不同的成員。

            當創(chuàng)建表時,SET成員值的尾部空格將自動被刪除。

            當檢索時,保存在SET列的值使用列定義中所使用的大小寫來顯示。請注意可以為SET列分配字符集和 校對規(guī)則。對于二進制或大小寫敏感的校對規(guī)則,當為列分配值時應考慮大小寫。

            MySQL用數(shù)字保存SET值,所保存值的低階位對應第1SET成員。如果在數(shù)值上下文中檢索一個SET值,檢索的值的位設置對應組成列值的SET成員。例如,你可以這樣從一個SET列檢索數(shù)值值:

            mysql> SELECT set_col+0 FROM tbl_name;

            如果將一個數(shù)字保存到SET列中,數(shù)字中二進制表示中的位確定了列值中的SET成員。對于指定為SET('a','b','c','d')的列,成員有下面的十進制和二進制值:

            SET成員

            十進制值

            二進制值

            'a'

            1

            0001

            'b'

            2

            0010

            'c'

            4

            0100

            'd'

            8

            1000

             

            如果你為該列分配一個值9,其二進制形式為1001,因此第1個和第4SET值成員'a''d'被選擇,結果值為 'a,d'

            對于包含多個SET元素的值,當插入值時元素所列的順序并不重要。在值中一個給定的元素列了多少次也不重要。當以后檢索該值時,值中的每個元素出現(xiàn)一次,根據(jù)表創(chuàng)建時指定的順序列出元素。例如,假定某個列指定為SET('a','b','c','d')

            mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));

            插入值'a,d''d,a''a,d,d''a,d,a''d,a,d':

            mysql> INSERT INTO myset (col) VALUES

            -> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

            Query OK, 5 rows affected (0.01 sec)

            Records: 5  Duplicates: 0  Warnings: 0

            當檢索時所有這些值顯示為 'a,d'

            mysql> SELECT col FROM myset;

            +------+

            | col  |

            +------+

            | a,d  |

            | a,d  |

            | a,d  |

            | a,d  |

            | a,d  |

            +------+

            5 rows in set (0.04 sec)

            如果將SET列設置為一個不支持的值,則該值被忽略并發(fā)出警告:

            mysql> INSERT INTO myset (col) VALUES ('a,d,d,s');

            Query OK, 1 row affected, 1 warning (0.03 sec)

             

            mysql> SHOW WARNINGS;

            +---------+------+------------------------------------------+

            | Level   | Code | Message                                  |

            +---------+------+------------------------------------------+

            | Warning | 1265 | Data truncated for column 'col' at row 1 |

            +---------+------+------------------------------------------+

            1 row in set (0.04 sec)

             

            mysql> SELECT col FROM myset;

            +------+

            | col  |

            +------+

            | a,d  |

            | a,d  |

            | a,d  |

            | a,d  |

            | a,d  |

            | a,d  |

            +------+

            6 rows in set (0.01 sec)

            SET值按數(shù)字順序排序。NULL值排在非NULL SET值的前面。

            通常情況,可以使用FIND_IN_SET()函數(shù)或LIKE操作符搜索SET值:

            mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;

            mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

            1個語句找出SET_col包含value set成員的行。第2個類似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一個SET成員的子字符串中。

            下面的語句也是合法的:

            mysql> SELECT * FROM tbl_name WHERE set_col & 1;

            mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

            1個語句尋找包含第1set成員的值。第2個語句尋找一個確切匹配的值。應注意第2類的比較。將set值與'val1,val2'比較返回的結果與同'val2,val1'比較返回的結果不同。指定值時的順序應與在列定義中所列的順序相同。

            如果想要為SET列確定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析輸出中第2列的SET定義。

              剛才研究MySQL文檔,發(fā)現(xiàn)SET類型的真正含義:

             

              實際上,SET可以包含最多64個成員,其值為一個整數(shù)。這個整數(shù)

            的二進制碼表示該SET的值的哪些成員為真。例如有SET('a','b','c','d')

            那么當它們的值為:

             

            SET member  Decimal value  Binary value

            -----------------------------

            a     1        0001

            b      2         0010

            c      4         0100

            d      8         1000

              如果你將9存入某個SET域,那么其二進制值為1001,也就是說這

            個值中'a''d'為真。

             

              可以想到,如果這樣的話,大家可以用LIKE命令和FIND_IN_SET()

            函數(shù)來檢索SET值:

             

            mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

            mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;

             

            當然,以下SQL語句也是合法的,他們顯得更加簡潔:

             

            mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

            mysql> SELECT * FROM tbl_name WHERE set_col & 1;

             

            哈哈,這么一來,大家下次控制權限的時候就不用設一個int型,然后

            在那里與呀或的,還要另外定義權限的名稱,用SET型字段輕松搞定!!

             

            --

            來源:.一網(wǎng)深情 bbs.uestc.edu.cn[FROM: 61.157.80.21]

             

            posted on 2009-08-06 14:14 肥仔 閱讀(1306) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫

            久久国产精品久久| 久久久久久亚洲精品不卡| 久久国产精品视频| 久久久午夜精品| 国产精品美女久久久m| 久久久久久久国产免费看| 日本加勒比久久精品| 国产亚洲综合久久系列| 精品一区二区久久久久久久网站| 99久久精品国产毛片| 日韩人妻无码精品久久久不卡| 99久久精品国产一区二区蜜芽| 亚洲精品无码久久不卡| 国产精品99久久精品爆乳| 久久精品中文闷骚内射| 色天使久久综合网天天| 久久精品欧美日韩精品| 久久毛片一区二区| 国产精品嫩草影院久久| 久久精品aⅴ无码中文字字幕不卡| 久久精品国产精品亚洲人人| 久久久www免费人成精品| 亚洲精品国产自在久久| 色综合久久88色综合天天| 久久91精品国产91久久户| 综合久久国产九一剧情麻豆| 99久久精品免费看国产一区二区三区 | 亚洲午夜久久久久久噜噜噜| 国产AV影片久久久久久 | 色婷婷久久综合中文久久一本| 国产精品视频久久久| 青青草原精品99久久精品66| 亚洲另类欧美综合久久图片区| 久久狠狠一本精品综合网| 99久久婷婷国产一区二区| 亚洲午夜精品久久久久久人妖| 久久夜色精品国产噜噜噜亚洲AV | 国产日产久久高清欧美一区| 久久99精品久久只有精品| 久久精品人人槡人妻人人玩AV| 久久99国产综合精品免费|