mysql 中set和enum的區別
SET是一個字串物件,可以有零或多個值,其值來自表建立時規定的允許的一列值。指定包括多個SET成員的SET列值時各成員之間用逗號(‘,’)間隔開。這樣SET成員值本身不能包含逗號。
例如,指定為SET('one', 'two') NOT NULL的列可以有下面的任何值:
''
'one'
'two'
'one,two'
SET最多可以有64個不同的成員。
當建立表時,SET成員值的尾部空格將自動被刪除。
當檢索時,儲存在SET列的值使用列定義中所使用的大小寫來顯示。請注意可以為SET列分配字符集和 校對規則。對於二進位制或大小寫敏感的校對規則,當為列分配值時應考慮大小寫。
MySQL用數字儲存SET值,所儲存值的低階位對應第1個SET成員。如果在數值上下文中檢索一個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個和第4個SET值成員'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個語句尋找包含第1個set成員的值。第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;
enum
mysql> show create table b;
+-------+-------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------+
| b | CREATE TABLE `b` (
`f1` enum('a','b','c') DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from b;
Empty set (0.00 sec)
mysql> insert into b values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into b values(2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into b values(3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into b values(4);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from b;
+------+
| f1 |
+------+
| a |
| b |
| c |
| |
+------+
4 rows in set (0.00 sec)
對於enum型別一次只能是列舉的某一個數值,大約個數或是0時,插入的值為空。
set型別適合用於複合值(類似多項選擇),enum適合於單值選擇(類似單項選擇)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22418990/viewspace-720795/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql中!=和is not的區別MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- java中list、set和map 的區別(轉)Java
- alter system set event和set events的區別
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- union, struct, enum 的 大小區別Struct
- MySQL中ENMU和SET的使用MySql
- MySQL中is not null和!=null和<>null的區別MySqlNull
- MySQL中CHAR和VARCHAR區別MySql
- java中Map,List與Set的區別Java
- set autotrace的用法和含意及區別
- PHP中MySQL、MySQLi和PDO的用法和區別PHPMySql
- java原始碼研究--List中的set和add方法區別Java原始碼
- MySQL中REPLACE INTO和INSERT INTO的區別分析MySql
- Mysql中S 鎖和 X 鎖的區別MySql
- Mysql中 int(10)和int(11)的區別MySql
- MySQL中datetime和timestamp的區別MySql
- mysql之ENUM列舉型別MySql型別
- List、Set、Map的區別
- set、List、map的區別
- MYSQL和SQL的區別MySql
- MySQL和Oracle的區別MySqlOracle
- Oracle和MySQL的區別OracleMySql
- Mysql中myisam和innodb的區別,至少5點MySql
- Mysql引擎中MyISAM和InnoDB的區別有哪些?MySql
- Spring set注入和構造注入的區別Spring
- 【轉】mysql 和 redis的區別MySqlRedis
- mysql中tinyint、smallint、int和bigint型別的用法區別MySql型別
- JavaScript中for in 和for of的區別JavaScript
- Js中for in 和for of的區別JS
- JavaScript中==和===的區別JavaScript
- MySQL語法中=與:=的區別MySql
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- Mysql中tinyint(1)和tinyint(4)的區別詳析WIFRMySql
- SQLserver-MySQL的區別和用法ServerMySql
- Oracle 和 mysql的9點區別OracleMySql
- 談談mysql和redis的區別MySqlRedis