MySQL中的set和enum

來源:互聯網
上載者:User

標籤:

MYSQL中 ENUM 類型的詳細解釋

  ENUM類型
    ENUM 是一個字串對象,其值通常選自一個允許值列表中,該列表在表建立時的列規格說明中被明確地列舉。

    在下列某些情況下,值也可以是空串("") 或 NULL:

    如果將一個無效值插入一個 ENUM (即,一個不在允許值列表中的字串),Null 字元串將作為一個特殊的錯誤值被插入。事實上,這個字串有別於一個"普通的"Null 字元串,因為這個字串有個數字索引值為 0。稍後有更詳細描述。
如果一個 ENUM 被聲明為 NULL,NULL 也是該列的一個合法值,並且該列的預設值也將為 NULL 。如果一個 ENUM 被聲明為 NOT NULL,該列的預設值將是該列表所允許值的第一個成員。
  每個枚舉值均有一個索引值:

  在列說明中列表值所允許的成員值被從 1 開始編號。
  Null 字元串錯誤值的索引值為 0。這就意味著,你可以使用下面所示的 SELECT 語句找出被賦於無效 ENUM值的記錄行。
    mysql> SELECT * FROM tbl_name WHERE enum_col=0;
    NULL 值的索引值為 NULL。

換個枚舉最大可以有 65535 個成員值。

從 MySQL 3.23.51 開始,當表被建立時,ENUM 值尾部的空格將會自動刪除。

  當為一個 ENUM 列賦值時,字母的大小寫是無關緊要的。然而,以後從列中檢索出來的值的大小寫卻是匹配於建立表時所指定的允許值。

  如果在一個數字語境中檢索一個ENUM,列值的索引值將被返回。例如,你可以像這樣使用數字值檢索一個 ENUM 列:

  mysql> SELECT enum_col+0 FROM tbl_name;
  如果將一個數字儲存到一個 ENUM 中,數字被當作為一個索引值,並且儲存的值是該索引值所對應的枚舉成員。(但是,這在 LOAD DATA 將不能工作,因為它視所有的輸入均為字串。) 在一個   ENUM 字串中儲存數字是不明智的,因為它可能會打亂思維。

  ENUM 值依照列規格說明中的列表順序進行排序。(換句話說,ENUM 值依照它們的索引號排序。)舉例來說,對於 ENUM("a", "b") "a" 排在 "b" 後,但是對於 ENUM("b", "a") , "b" 卻排在 "a" 之前。Null 字元串排在非Null 字元串前,NULL 值排在其它所有的枚舉值前。為了防止意想不到的結果,建議依照字母的順序定義 ENUM 列表。也可以通過使用 GROUP BY CONCAT(col) 來確定該以字母順序排序而不是以索引值。

  如果希望得到一個 ENUM 列的所有可能值,可以使用 SHOW COLUMNS FROM table_name LIKE enum_colum

 

set,enum的資料類型都是字串類型的對象,其中set最多可以包含64個元素,並且可以任意取到集合中的元素。而enum則是只能取到集合中的木一個元素,最多包含65536個元素,也就是說set是多項選擇,enum是單項選擇了。

 1 MariaDB [stu149]> create table db_set( 2     -> set1 set(‘x‘,‘y‘,‘z‘) not null, 3     -> enum1 enum(‘one‘,‘two‘,‘three‘) not null); 4 Query OK, 0 rows affected (0.25 sec) 5  6 MariaDB [stu149]> desc db_set; 7 +-------+---------------------------+------+-----+---------+-------+ 8 | Field | Type                      | Null | Key | Default | Extra | 9 +-------+---------------------------+------+-----+---------+-------+10 | set1  | set(‘x‘,‘y‘,‘z‘)          | NO   |     | NULL    |       |11 | enum1 | enum(‘one‘,‘two‘,‘three‘) | NO   |     | NULL    |       |12 +-------+---------------------------+------+-----+---------+-------+13 2 rows in set (0.01 sec)14 15 MariaDB [stu149]> insert into db_set values(1,3),(1,4),(4,1);16 Query OK, 3 rows affected, 1 warning (0.09 sec)17 Records: 3  Duplicates: 0  Warnings: 118 19 MariaDB [stu149]> select * from db_set;20 +------+-------+21 | set1 | enum1 |22 +------+-------+23 | x    | three |24 | x    |       |25 | z    | one   |26 +------+-------+27 3 rows in set (0.00 sec)28 29 MariaDB [stu149]> insert into db_set values(2,0);30 Query OK, 1 row affected, 1 warning (0.08 sec)31 32 MariaDB [stu149]> insert into db_set values(3,2);33 Query OK, 1 row affected (0.05 sec)34 35 MariaDB [stu149]> select * from db_set;36 +------+-------+37 | set1 | enum1 |38 +------+-------+39 | x    | three |40 | x    |       |41 | z    | one   |42 | y    |       |43 | x,y  | two   |44 +------+-------+45 5 rows in set (0.00 sec)46 47 MariaDB [stu149]> insert into db_set values(2,6);48 Query OK, 1 row affected, 1 warning (0.14 sec)49 50 MariaDB [stu149]> select * from db_set;51 +------+-------+52 | set1 | enum1 |53 +------+-------+54 | x    | three |55 | x    |       |56 | z    | one   |57 | y    |       |58 | x,y  | two   |59 | y    |       |60 +------+-------+61 6 rows in set (0.00 sec)

 

 

set類型中對於超出它能表示的範圍的,就用二進位來加去:

set元素  十進位    二進位

‘x‘     1      0001

‘y‘     2      0010

‘z‘     4      0100

enum類型超出自己能表示的範圍,就附空值了:

enym元素   索引  

null      null 

""        0

"one"      1

"two"      2

"three"      3

 

MySQL中的set和enum

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.