• <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 肥仔 閱讀(1306) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫

            久久精品三级视频| 久久夜色精品国产噜噜亚洲AV| 久久婷婷五月综合国产尤物app| 久久精品国产男包| 国内精品九九久久精品| 新狼窝色AV性久久久久久| 久久精品国产清自在天天线 | 久久无码AV中文出轨人妻| 久久99精品久久久久久动态图| 亚洲午夜久久久影院| 久久久久久亚洲AV无码专区| 久久精品麻豆日日躁夜夜躁| 91久久精品91久久性色| 国产精品热久久毛片| 久久久久这里只有精品 | 亚洲国产成人久久综合野外| 日本久久久久久久久久| 久久久亚洲AV波多野结衣| 久久精品国产亚洲AV无码麻豆 | 色偷偷88888欧美精品久久久| 久久久久亚洲AV片无码下载蜜桃 | 伊人久久大香线蕉成人| 午夜不卡久久精品无码免费| 国产精品久久毛片完整版| 久久亚洲欧美日本精品| 久久久久久久91精品免费观看| 久久精品99久久香蕉国产色戒| 亚洲一区中文字幕久久| 久久这里只有精品首页| www久久久天天com| 亚洲国产成人久久笫一页| 国产亚洲美女精品久久久久狼| 深夜久久AAAAA级毛片免费看| 国产成人久久精品一区二区三区| 久久精品国产亚洲Aⅴ香蕉 | 久久国产精品成人免费| 超级97碰碰碰碰久久久久最新| 国产99久久久国产精品~~牛 | 久久av无码专区亚洲av桃花岛| 人妻丰满?V无码久久不卡| 99国产欧美精品久久久蜜芽|