MySQL學習(二) 數據類型

MySQL支持多種列類型:數值類型、日期/時間類型和字符串(字符)類型。mysql

數值類型

數值類型又分爲整數型與小數型sql

整數型

下面的表顯示了須要的每一個整數類型的存儲和範圍函數

建立一張表操作系統

mysql> CREATE TABLE t_int (
	int_1 TINYINT,
	int_2 SMALLINT,
	int_3 MEDIUMINT,
	int_4 INT,
	int_5 BIGINT);
Query OK, 0 rows affected

mysql> DESC t_int;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| int_1 | tinyint(4)   | YES  |     | NULL    |       |
| int_2 | smallint(6)  | YES  |     | NULL    |       |
| int_3 | mediumint(9) | YES  |     | NULL    |       |
| int_4 | int(11)      | YES  |     | NULL    |       |
| int_5 | bigint(20)   | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set

插入數據,只能插入整型,數據類型不正確或者超出範圍都會致使插入數據失敗命令行

mysql> INSERT INTO t_int VALUES(100, 100, 100, 100, 100);
Query OK, 1 row affected

mysql> INSERT INTO t_int VALUES('a', 'b', 100, 200, 300); -- 數據類型不正確
1366 - Incorrect integer value: 'a' for column 'int_1' at row 1
mysql> INSERT INTO t_int VALUES(255, 10000, 1000, 100000, 1000000); -- 超出範圍
1264 - Out of range value for column 'int_1' at row 1
mysql> SELECT * FROM t_int;
+-------+-------+-------+-------+-------+
| int_1 | int_2 | int_3 | int_4 | int_5 |
+-------+-------+-------+-------+-------+
|   100 |   100 |   100 |   100 |   100 |
+-------+-------+-------+-------+-------+
1 row in set

SQL中的數值類型所有都是默認有符號,分正負,若是要使用無符號數據,則須要用UNSIGNED關鍵字對數據類型進行限定對象

mysql> ALTER TABLE t_int ADD COLUMN int_6 TINYINT UNSIGNED; -- 無符號類型
Query OK, 1 row affected
Records: 1  Duplicates: 0  Warnings: 0

mysql> DESC t_int;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| int_1 | tinyint(4)          | YES  |     | NULL    |       |
| int_2 | smallint(6)         | YES  |     | NULL    |       |
| int_3 | mediumint(9)        | YES  |     | NULL    |       |
| int_4 | int(11)             | YES  |     | NULL    |       |
| int_5 | bigint(20)          | YES  |     | NULL    |       |
| int_6 | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
6 rows in set

mysql> INSERT INTO t_int VALUES(127, 10000, 100000, 100000, 1000000, 255); -- TINYINT無符號類型的取值範圍爲0-255
Query OK, 1 row affected

mysql> SELECT * FROM t_int;
+-------+-------+--------+--------+---------+-------+
| int_1 | int_2 | int_3  | int_4  | int_5   | int_6 |
+-------+-------+--------+--------+---------+-------+
|   100 |   100 |    100 |    100 |     100 | NULL  |
|   127 | 10000 | 100000 | 100000 | 1000000 |   255 |
+-------+-------+--------+--------+---------+-------+
2 rows in set

給字段加了無符號的限定後,數據插入成功了,在查看錶結構的時候,發現每一個字段的數據類型以後都會自帶一個括號,裏面有指定的數字,這個數字表示數據最終顯示的位數,例如-123表示顯示4位(包括符號位),255表示顯示3位,實際上這個數字沒有什麼特別的含義,只是默認告訴用戶能夠顯示的寬度而已,並不會改變數據的大小。blog

mysql> ALTER TABLE t_int ADD COLUMN int_7 TINYINT(1) UNSIGNED; -- 顯示指定顯示寬度
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t_int VALUES(127, 10000, 100000, 100000, 1000000, 255, 255);
Query OK, 1 row affected

mysql> SELECT * FROM t_int;
+-------+-------+--------+--------+---------+-------+-------+
| int_1 | int_2 | int_3  | int_4  | int_5   | int_6 | int_7 |
+-------+-------+--------+--------+---------+-------+-------+
|   100 |   100 |    100 |    100 |     100 | NULL  | NULL  |
|   127 | 10000 | 100000 | 100000 | 1000000 |   255 | NULL  |
|   127 | 10000 | 100000 | 100000 | 1000000 |   255 |   255 |
+-------+-------+--------+--------+---------+-------+-------+
3 rows in set

顯示寬度的意義在於當數據不夠顯示寬度的時候,能夠使用ZEROFILL爲數字列進行零填充,這時MySQL自動爲該列添加UNSIGNED屬性索引

mysql> ALTER TABLE t_int ADD COLUMN int_8 TINYINT(2) UNSIGNED ZEROFILL;
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t_int VALUES(127, 10000, 100000, 100000, 1000000, 255, 255, 1);
Query OK, 1 row affected

mysql> SELECT * FROM t_int;
+-------+-------+--------+--------+---------+-------+-------+-------+
| int_1 | int_2 | int_3  | int_4  | int_5   | int_6 | int_7 | int_8 |
+-------+-------+--------+--------+---------+-------+-------+-------+
|   100 |   100 |    100 |    100 |     100 | NULL  | NULL  | NULL  |
|   127 | 10000 | 100000 | 100000 | 1000000 |   255 | NULL  | NULL  |
|   127 | 10000 | 100000 | 100000 | 1000000 |   255 |   255 | NULL  |
|   127 | 10000 | 100000 | 100000 | 1000000 |   255 |   255 |   01  |
+-------+-------+--------+--------+---------+-------+-------+-------+
4 rows in set

MySQL客戶端如Navicat中可能不能正確顯示零填充的效果,能夠使用命令行窗口進行查看。ci

小數型

SQL中將小數型又分爲浮點型和定點型兩種字符串

浮點型:小數點浮動,精度有限,而且會丟失精度(會進行四捨五入),精度位數大概在7位

定點型:小數點固定,精度固定,不會丟失精度,精度位數大概在15位

浮點型

對於浮點列類型,在MySQL中單精度值使用4個字節,雙精度值使用8個字節。

FLOAT類型用於表示近似數值數據類型。SQL標準容許在關鍵字FLOAT後面的括號內選擇用位指定精度(但不能爲指數範圍)。MySQL還支持可選的只用於肯定存儲大小的精度規定0到23的精度對應FLOAT列的4字節單精度。24到53的精度對應DOUBLE列的8字節雙精度。

一個FLOAT類型的數字,容許的值爲-3.402823466E+38至-1.175494351E-38,0,1.175494351E-38至3.402823466E+38,這些是基於IEEE標準的理論值,實際範圍根據硬件或操做系統可能會稍微小一些。

MySQL容許使用非標準語法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。這裏,「(M,D)」表示該值一共顯示M位整數,其中D位位於小數點後面。例如,定義爲FLOAT(7,4)的一個列能夠顯示爲-999.9999。MySQL保存值時進行四捨五入,所以若是在FLOAT(7,4)列內插入999.00009,近似結果是999.0001。

下面以FLOAT爲例子,DOUBLE相似

mysql> CREATE TABLE t_float(
	float_1	FLOAT,
	float_2 FLOAT(10, 2),
	float_3 FLOAT(6, 2));
Query OK, 0 rows affected

mysql> DESC t_float;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| float_1 | float       | YES  |     | NULL    |       |
| float_2 | float(10,2) | YES  |     | NULL    |       |
| float_3 | float(6,2)  | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set

mysql> INSERT INTO t_float VALUES (1000.10,1000.10,1000.10); -- 正常數據
Query OK, 1 row affected

mysql> INSERT INTO t_float VALUES (1234567890,12345678.90,1234.56); -- 正常數據
Query OK, 1 row affected

mysql> INSERT INTO t_float VALUES (3e38,3.01e7,1234.56); -- 能夠用科學計數法表示
Query OK, 1 row affected

mysql> INSERT INTO t_float VALUES (9999999999,99999999.99,9999.99); -- 插入最大值,超過精度位數時系統會進行四捨五入
Query OK, 1 row affected

mysql> SELECT * FROM t_float;
+-------------+--------------+---------+
| float_1     | float_2      | float_3 |
+-------------+--------------+---------+
|      1000.1 |      1000.10 | 1000.10 |
|  1234570000 |  12345679.00 | 1234.56 |
|        3e38 |  30100000.00 | 1234.56 |
| 10000000000 | 100000000.00 | 9999.99 |
+-------------+--------------+---------+
4 rows in set

在插入浮點型數據的時候,整型部分是不能超出長度的,可是小數部分能夠超出長度(系統會自動四捨五入)

mysql> INSERT INTO t_float VALUES (123456,1234.123456768,123.9876543); -- 小數部分超出,四捨五入
Query OK, 1 row affected

mysql> INSERT INTO t_float VALUES (123456,1234.12,12345.56);
1264 - Out of range value for column 'float_3' at row 1

mysql> SELECT * FROM t_float;
+-------------+--------------+---------+
| float_1     | float_2      | float_3 |
+-------------+--------------+---------+
|      1000.1 |      1000.10 | 1000.10 |
|  1234570000 |  12345679.00 | 1234.56 |
|        3e38 |  30100000.00 | 1234.56 |
| 10000000000 | 100000000.00 | 9999.99 |
|      123456 |      1234.12 |  123.99 |
+-------------+--------------+---------+
5 rows in set (0.00 sec)

超出精度範圍的浮點數,系統會自動進行四捨五入,若是由於系統進位致使整數部分超出指定的長度,這也是被容許的,例如上面的第4條記錄。

爲了保證最大可能的可移植性,須要使用近似數值數據值存儲的代碼應使用FLOAT或DOUBLE PRECISION,不規定精度或位數。

定點型

DECIMAL和NUMERIC類型在MySQL中視爲相同的類型。它們用於保存必須爲確切精度的值,例如貨幣數據。當聲明該類型的列時,能夠(而且一般要)指定精度和標度,如

salary DECIMAL(5,2)

在該例子中,5是精度,2是標度。精度表示保存值的主要位數,標度表示小數點後面能夠保存的位數。

在標準SQL中,語法DECIMAL(M)等價於DECIMAL(M,0)。一樣,語法DECIMAL等價於DECIMAL(M,0),能夠經過計算肯定M的值。在MySQL中支持DECIMAL和NUMERIC數據類型的變量形式。M默認值是10。

DECIMAL或NUMERIC的最大位數是65,但具體的DECIMAL或NUMERIC列的實際範圍受具體列的精度或標度約束。

mysql> CREATE TABLE t_decimal (
	float_1 FLOAT (10, 2),
	decimal_1 DECIMAL (10, 2));
Query OK, 0 rows affected

mysql> INSERT INTO t_decimal VALUES (12345678.90,12345678.90); -- 正常數據
Query OK, 1 row affected

mysql> INSERT INTO t_decimal VALUES (1234.123456,1234.1234356); -- 小數部分四捨五入
Query OK, 1 row affected

mysql> INSERT INTO t_decimal VALUES (99999999.99,99999999.99); -- 最大值
Query OK, 1 row affected

mysql> INSERT INTO t_decimal VALUES (99999999.99,99999999.999); -- 進位超出指定位數,不容許
1264 - Out of range value for column 'decimal_1' at row 1

mysql> SELECT * FROM t_decimal;
+--------------+-------------+
| float_1      | decimal_1   |
+--------------+-------------+
|  12345679.00 | 12345678.90 |
|      1234.12 |     1234.12 |
| 100000000.00 | 99999999.99 |
+--------------+-------------+
3 rows in set (0.00 sec)

時間日期類型

表示時間值的DATE和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。每一個時間類型有一個有效值範圍和一個「零」值,當指定不合法的MySQL不能表示的值時使用「零」值。

mysql> CREATE TABLE t_date (
	id INT,
	date_1 DATETIME,
	date_2 TIMESTAMP,
	date_3 DATE,
	date_4 TIME,
	date_5 YEAR);
Query OK, 0 rows affected

mysql> DESC t_date; -- timestamap不容許爲空,有個默認值,爲當前時間
+--------+-----------+------+-----+-------------------+-----------------------------+
| Field  | Type      | Null | Key | Default           | Extra                       |
+--------+-----------+------+-----+-------------------+-----------------------------+
| id     | int(11)   | YES  |     | NULL              |                             |
| date_1 | datetime  | YES  |     | NULL              |                             |
| date_2 | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| date_3 | date      | YES  |     | NULL              |                             |
| date_4 | time      | YES  |     | NULL              |                             |
| date_5 | year(4)   | YES  |     | NULL              |                             |
+--------+-----------+------+-----+-------------------+-----------------------------+
6 rows in set

mysql> INSERT INTO t_date VALUES(1, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', '2018'); -- 正常數據
Query OK, 1 row affected

mysql> INSERT INTO t_date VALUES(2, '2018-6-24 15:17:58', NULL, '2018-6-24', '15:18:27', '2018'); -- timestamp爲空NULL,會自動賦當前時間
Query OK, 1 row affected

mysql> SELECT * FROM t_date;
+----+---------------------+---------------------+------------+----------+--------+
| id | date_1              | date_2              | date_3     | date_4   | date_5 |
+----+---------------------+---------------------+------------+----------+--------+
|  1 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2018 |
|  2 | 2018-06-24 15:17:58 | 2018-06-24 15:35:55 | 2018-06-24 | 15:18:27 |   2018 |
+----+---------------------+---------------------+------------+----------+--------+
2 rows in set

'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。容許「不嚴格」語法:任何標點符均可以用作日期部分或時間部分之間的間割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等價的

'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。這裏也容許使用「不嚴格的」語法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等價的。

'YYYYMMDD'或'YYMMDD'格式的沒有間割符的字符串,假定字符串對於日期類型是有意義的。例如,'19970523'和'970523'被解釋爲 '1997-05-23',但'971332'是不合法的(它有一個沒有意義的月和日部分),將變爲'0000-00-00'。

YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的數字,假定數字對於日期類型是有意義的。例如,19830905132800和830905132800被解釋爲 '1983-09-05 13:28:00'。

YYYYMMDD或YYMMDD格式的數字,假定數字對於日期類型是有意義的。例如,19830905和830905被解釋爲'1983-09-05'。

mysql> INSERT INTO t_date VALUES(3, '2018@6@24 15^17^58', '2018#6#24 15+18+14', '2018/6/24', '15:18:27', '2018'); -- 用不一樣的標點符號作分隔符
Query OK, 1 row affected

mysql> SET sql_mode = ''; -- 設置非嚴格模式,只在該會話中有效
Query OK, 0 rows affected

mysql> SELECT @@sql_mode; -- 查看設置是否生效
+------------+
| @@sql_mode |
+------------+
|            |
+------------+
1 row in set

mysql> INSERT INTO t_date VALUES(4, 20180624151758, 180624151814, 20181324, '15:18:27', '2018'); -- 插入20181324時會自動轉換爲零值,前提是要設置非嚴格模式,不然報錯
Query OK, 1 row affected

mysql> SELECT * FROM t_date;
+----+---------------------+---------------------+------------+----------+--------+
| id | date_1              | date_2              | date_3     | date_4   | date_5 |
+----+---------------------+---------------------+------------+----------+--------+
|  1 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2018 |
|  2 | 2018-06-24 15:17:58 | 2018-06-24 15:35:55 | 2018-06-24 | 15:18:27 |   2018 |
|  3 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2018 |
|  4 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 0000-00-00 | 15:18:27 |   2018 |
+----+---------------------+---------------------+------------+----------+--------+
4 rows in set

YEAR類型能夠用二位數,也能夠用四位數表示

四位字符串,範圍爲'1901'到'2155'。

四位數字,範圍爲1901到2155。

兩位字符串,範圍爲'00'到'99'。'00'到'69'和'70'到'99'範圍的值被轉換爲2000到2069和1970到1999範圍的YEAR值。

兩位整數,範圍爲1到99。1到69和70到99範圍的值被轉換爲2001到2069和1970到1999範圍的YEAR值。請注意兩位整數範圍與兩位字符串範圍稍有不一樣,由於你不能直接將零指定爲一個字符串'0'或'00'或它被解釋爲0000。

mysql> INSERT INTO t_date VALUES(6, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', 2100);
Query OK, 1 row affected

mysql> INSERT INTO t_date VALUES(7, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', 2166); -- 超出範圍轉換爲零值
Query OK, 1 row affected

mysql> INSERT INTO t_date VALUES(8, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', '69');
Query OK, 1 row affected

mysql> INSERT INTO t_date VALUES(9, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', '70');
Query OK, 1 row affected

mysql> SELECT * FROM t_date;
+------+---------------------+---------------------+------------+----------+--------+
| id   | date_1              | date_2              | date_3     | date_4   | date_5 |
+------+---------------------+---------------------+------------+----------+--------+
|    1 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2018 |
|    2 | 2018-06-24 15:17:58 | 2018-06-24 15:35:55 | 2018-06-24 | 15:18:27 |   2018 |
|    3 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2018 |
|    4 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 0000-00-00 | 15:18:27 |   2018 |
|    6 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2100 |
|    7 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   0000 |
|    8 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   2069 |
|    9 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 |   1970 |
+------+---------------------+---------------------+------------+----------+--------+
8 rows in set (0.00 sec)

字符串類型

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

CHAR與VARCHAR類型

CHAR表示定長,如CHAR(10)表示能夠存儲10個字符,最大長度爲255個字符,當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程當中不進行大小寫轉換。

VARCHAR表示變長,如VARCHAR(10)表示能夠存儲10個字符,最大長度爲65535個字符(VARCHAR的最大有效長度由最大行大小和使用的字符集肯定,實際最大長度爲65532個字符),與CHAR不一樣的是,VARCHAR值保存時只保存須要的字符數,另加一個字節表示字符的長度(若是長度超過255,則使用兩個字節)。

VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留。

下面的表顯示了將各類字符串值保存到CHAR(4)和VARCHAR(4)列後的結果,說明了CHAR和VARCHAR之間的差異:

請注意上表中最後一行的值只適用不使用嚴格模式時;若是MySQL運行在嚴格模式,超過列長度不的值不保存,而且會出現錯誤。

定長的磁盤空間比較浪費, 可是效率高

相反的,變長的磁盤空間比較節省, 可是效率低

BINARY與VARBINARY類型

 

BLOB與TEXT類型

一般超過255個字符的數據使用大文本進行存儲,根據存儲的數據格式分爲BLOB與TEXT,BLOB用來存儲二進制數據(少用),TEXT用來存儲文字。

BLOB是一個二進制大對象,能夠容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不一樣。

有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有相同的最大長度和存儲需求。

ENUM類型

ENUM是一個字符串對象,其值來自表建立時在列規定中顯式枚舉的一列值,每一個枚舉值有一個索引(NULL值的索引是NULL),從1開始編號

mysql> CREATE TABLE t_enum ( -- 建立枚舉表
	gender ENUM('man', 'woman', 'unknow'));

Query OK, 0 rows affected

mysql> INSERT INTO t_enum VALUES ('man');
Query OK, 1 row affected

mysql> INSERT INTO t_enum VALUES ('woman');
Query OK, 1 row affected

mysql> INSERT INTO t_enum VALUES ('haha'); -- 不在枚舉定義的值裏面,不容許插入,起到規範數據的做用
1265 - Data truncated for column 'gender' at row 1

若是在數值上下文中檢索一個ENUM值,將返回列值的索引。例如,你能夠這樣從ENUM列搜索數值值:

mysql> SELECT gender + 0, gender FROM t_enum;
+------------+--------+
| gender + 0 | gender |
+------------+--------+
|          1 | man    |
|          2 | woman  |
+------------+--------+
2 rows in set

因爲枚舉存儲的是數值,因此能夠直接插入數值

mysql> INSERT INTO t_enum VALUES (1), (2); -- 直接插入數值
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT gender + 0, gender FROM t_enum;
+------------+--------+
| gender + 0 | gender |
+------------+--------+
|          1 | man    |
|          2 | woman  |
|          1 | man    |
|          2 | woman  |
+------------+--------+
4 rows in set

SET類型

集合跟枚舉很相似,實際存儲的是數值(SET最多能夠有64個不一樣的成員),而不是字符串,能夠把集合當作是多選框,枚舉當作是單選

mysql> CREATE TABLE t_set (
	letter SET ('a', 'b', 'c', 'd'));
Query OK, 0 rows affected

mysql> INSERT INTO t_set VALUES ('a,b');
Query OK, 1 row affected

mysql> INSERT INTO t_set VALUES ('a,b,c');
Query OK, 1 row affected

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

mysql> SELECT letter + 0, letter FROM t_set;
+------------+--------+
| letter + 0 | letter |
+------------+--------+
|          3 | a,b    |
|          7 | a,b,c  |
+------------+--------+
2 rows in set

若是你爲該列分配一個值9,其二進制形式爲1001,所以第1個和第4個SET值成員'a'和'd'被選擇,結果值爲 'a,d'。
對於包含多個SET元素的值,當插入值時元素所列的順序並不重要。在值中一個給定的元素列了多少次也不重要。當之後檢索該值時,值中的每一個元素出現一次,根據表建立時指定的順序列出元素。例如,插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d'

mysql> INSERT INTO t_set VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT letter + 0, letter FROM t_set; -- 檢索時全部的值將顯示爲a,d
+------------+--------+
| letter + 0 | letter |
+------------+--------+
|          3 | a,b    |
|          7 | a,b,c  |
|          9 | a,d    |
|          9 | a,d    |
|          9 | a,d    |
|          9 | a,d    |
|          9 | a,d    |
+------------+--------+
7 rows in set

一般狀況,能夠使用FIND_IN_SET()函數或LIKE操做符搜索SET值:

mysql> SELECT * FROM t_set WHERE FIND_IN_SET('a',letter) > 0; -- 表示找出t_set包含a的成員
+--------+
| letter |
+--------+
| a,b    |
| a,b,c  |
| a,d    |
| a,d    |
| a,d    |
| a,d    |
| a,d    |
+--------+
7 rows in set

mysql> SELECT * FROM t_set WHERE letter LIKE '%a%'; -- 全部set中包含a的成員,甚至是在另外一個SET成員的子字符串中
+--------+
| letter |
+--------+
| a,b    |
| a,b,c  |
| a,d    |
| a,d    |
| a,d    |
| a,d    |
| a,d    |
+--------+
7 rows in set
相關文章
相關標籤/搜索