• <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

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

            mysql中的set類型

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

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

            ''

            'one'

            'two'

            'one,two'

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

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

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

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

            mysql> SELECT set_col+0 FROM tbl_name;

            如果將一個數字保存到SET列中,數字中二進制表示中的位確定了列值中的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元素的值,當插入值時元素所列的順序并不重要。在值中一個給定的元素列了多少次也不重要。當以后檢索該值時,值中的每個元素出現一次,根據表創建時指定的順序列出元素。例如,假定某個列指定為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列設置為一個不支持的值,則該值被忽略并發出警告:

            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值按數字順序排序。NULL值排在非NULL SET值的前面。

            通常情況,可以使用FIND_IN_SET()函數或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文檔,發現SET類型的真正含義:

             

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

            的二進制碼表示該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()

            函數來檢索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型字段輕松搞定!!

             

            --

            來源:.一網深情 bbs.uestc.edu.cn[FROM: 61.157.80.21]

             

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

            久久综合精品国产一区二区三区| 精品久久久久国产免费| 偷偷做久久久久网站| 久久精品国产免费观看| 97精品久久天干天天天按摩| 91精品国产综合久久香蕉| 一级做a爰片久久毛片看看| 久久亚洲精品无码VA大香大香 | 久久天堂AV综合合色蜜桃网| 久久免费高清视频| 一本色道久久88综合日韩精品| 久久精品国产清高在天天线| 久久99国产一区二区三区| 无码人妻久久一区二区三区免费丨 | 人妻中文久久久久| 无码日韩人妻精品久久蜜桃| 国产精品美女久久久久AV福利| 久久人人爽人人爽人人av东京热| 亚洲一区中文字幕久久| 77777亚洲午夜久久多喷| 精品久久久久久久久久久久久久久 | 亚洲国产精品久久久久网站| 久久精品国产久精国产果冻传媒 | 久久九色综合九色99伊人| 亚洲精品无码久久一线| 久久一本综合| 久久精品国产欧美日韩| 精品久久一区二区三区| 性做久久久久久久| 国产美女亚洲精品久久久综合| 国产视频久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品中文字幕有码| 99久久无码一区人妻| 久久国产精品成人免费| 精品免费久久久久久久| 久久精品国产亚洲精品2020| 久久综合久久自在自线精品自| 少妇熟女久久综合网色欲| 无码国内精品久久综合88 | 日韩电影久久久被窝网|