mysql里面有没有map类型_MySQL学习(二) 数据类型
MySQL支持多種列類型:數(shù)值類型、日期/時(shí)間類型和字符串(字符)類型。
數(shù)值類型
數(shù)值類型又分為整數(shù)型與小數(shù)型
整數(shù)型
下面的表顯示了需要的每個(gè)整數(shù)類型的存儲(chǔ)和范圍
創(chuàng)建一張表
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
插入數(shù)據(jù),只能插入整型,數(shù)據(jù)類型不正確或者超出范圍都會(huì)導(dǎo)致插入數(shù)據(jù)失敗
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); -- 數(shù)據(jù)類型不正確
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中的數(shù)值類型全部都是默認(rèn)有符號(hào),分正負(fù),如果要使用無(wú)符號(hào)數(shù)據(jù),則需要用UNSIGNED關(guān)鍵字對(duì)數(shù)據(jù)類型進(jìn)行限定
mysql> ALTER TABLE t_int ADD COLUMN int_6 TINYINT UNSIGNED; -- 無(wú)符號(hào)類型
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無(wú)符號(hào)類型的取值范圍為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
給字段加了無(wú)符號(hào)的限定后,數(shù)據(jù)插入成功了,在查看表結(jié)構(gòu)的時(shí)候,發(fā)現(xiàn)每個(gè)字段的數(shù)據(jù)類型之后都會(huì)自帶一個(gè)括號(hào),里面有指定的數(shù)字,這個(gè)數(shù)字表示數(shù)據(jù)最終顯示的位數(shù),例如-123表示顯示4位(包括符號(hào)位),255表示顯示3位,實(shí)際上這個(gè)數(shù)字沒有什么特別的含義,只是默認(rèn)告訴用戶可以顯示的寬度而已,并不會(huì)改變數(shù)據(jù)的大小。
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
顯示寬度的意義在于當(dāng)數(shù)據(jù)不夠顯示寬度的時(shí)候,可以使用ZEROFILL為數(shù)字列進(jìn)行零填充,這時(shí)MySQL自動(dòng)為該列添加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中可能不能正確顯示零填充的效果,可以使用命令行窗口進(jìn)行查看。
小數(shù)型
SQL中將小數(shù)型又分為浮點(diǎn)型和定點(diǎn)型兩種
浮點(diǎn)型:小數(shù)點(diǎn)浮動(dòng),精度有限,并且會(huì)丟失精度(會(huì)進(jìn)行四舍五入),精度位數(shù)大概在7位
定點(diǎn)型:小數(shù)點(diǎn)固定,精度固定,不會(huì)丟失精度,精度位數(shù)大概在15位
浮點(diǎn)型
對(duì)于浮點(diǎn)列類型,在MySQL中單精度值使用4個(gè)字節(jié),雙精度值使用8個(gè)字節(jié)。
FLOAT類型用于表示近似數(shù)值數(shù)據(jù)類型。SQL標(biāo)準(zhǔn)允許在關(guān)鍵字FLOAT后面的括號(hào)內(nèi)選擇用位指定精度(但不能為指數(shù)范圍)。MySQL還支持可選的只用于確定存儲(chǔ)大小的精度規(guī)定0到23的精度對(duì)應(yīng)FLOAT列的4字節(jié)單精度。24到53的精度對(duì)應(yīng)DOUBLE列的8字節(jié)雙精度。
一個(gè)FLOAT類型的數(shù)字,允許的值為-3.402823466E+38至-1.175494351E-38,0,1.175494351E-38至3.402823466E+38,這些是基于IEEE標(biāo)準(zhǔn)的理論值,實(shí)際范圍根據(jù)硬件或操作系統(tǒng)可能會(huì)稍微小一些。
MySQL允許使用非標(biāo)準(zhǔn)語(yǔ)法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。這里,“(M,D)”表示該值一共顯示M位整數(shù),其中D位位于小數(shù)點(diǎn)后面。例如,定義為FLOAT(7,4)的一個(gè)列可以顯示為-999.9999。MySQL保存值時(shí)進(jìn)行四舍五入,因此如果在FLOAT(7,4)列內(nèi)插入999.00009,近似結(jié)果是999.0001。
下面以FLOAT為例子,DOUBLE類似
mysql> CREATE TABLE t_float(
float_1FLOAT,
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); -- 正常數(shù)據(jù)
Query OK, 1 row affected
mysql> INSERT INTO t_float VALUES (1234567890,12345678.90,1234.56); -- 正常數(shù)據(jù)
Query OK, 1 row affected
mysql> INSERT INTO t_float VALUES (3e38,3.01e7,1234.56); -- 可以用科學(xué)計(jì)數(shù)法表示
Query OK, 1 row affected
mysql> INSERT INTO t_float VALUES (9999999999,99999999.99,9999.99); -- 插入最大值,超過(guò)精度位數(shù)時(shí)系統(tǒng)會(huì)進(jìn)行四舍五入
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
在插入浮點(diǎn)型數(shù)據(jù)的時(shí)候,整型部分是不能超出長(zhǎng)度的,但是小數(shù)部分可以超出長(zhǎng)度(系統(tǒng)會(huì)自動(dòng)四舍五入)
mysql> INSERT INTO t_float VALUES (123456,1234.123456768,123.9876543); -- 小數(shù)部分超出,四舍五入
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)
超出精度范圍的浮點(diǎn)數(shù),系統(tǒng)會(huì)自動(dòng)進(jìn)行四舍五入,如果因?yàn)橄到y(tǒng)進(jìn)位導(dǎo)致整數(shù)部分超出指定的長(zhǎng)度,這也是被允許的,例如上面的第4條記錄。
為了保證最大可能的可移植性,需要使用近似數(shù)值數(shù)據(jù)值存儲(chǔ)的代碼應(yīng)使用FLOAT或DOUBLE PRECISION,不規(guī)定精度或位數(shù)。
定點(diǎn)型
DECIMAL和NUMERIC類型在MySQL中視為相同的類型。它們用于保存必須為確切精度的值,例如貨幣數(shù)據(jù)。當(dāng)聲明該類型的列時(shí),可以(并且通常要)指定精度和標(biāo)度,如
salary DECIMAL(5,2)
在該例子中,5是精度,2是標(biāo)度。精度表示保存值的主要位數(shù),標(biāo)度表示小數(shù)點(diǎn)后面可以保存的位數(shù)。
在標(biāo)準(zhǔn)SQL中,語(yǔ)法DECIMAL(M)等價(jià)于DECIMAL(M,0)。同樣,語(yǔ)法DECIMAL等價(jià)于DECIMAL(M,0),可以通過(guò)計(jì)算確定M的值。在MySQL中支持DECIMAL和NUMERIC數(shù)據(jù)類型的變量形式。M默認(rèn)值是10。
DECIMAL或NUMERIC的最大位數(shù)是65,但具體的DECIMAL或NUMERIC列的實(shí)際范圍受具體列的精度或標(biāo)度約束。
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); -- 正常數(shù)據(jù)
Query OK, 1 row affected
mysql> INSERT INTO t_decimal VALUES (1234.123456,1234.1234356); -- 小數(shù)部分四舍五入
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); -- 進(jìn)位超出指定位數(shù),不允許
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)
時(shí)間日期類型
表示時(shí)間值的DATE和時(shí)間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。每個(gè)時(shí)間類型有一個(gè)有效值范圍和一個(gè)“零”值,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用“零”值。
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不允許為空,有個(gè)默認(rèn)值,為當(dāng)前時(shí)間
+--------+-----------+------+-----+-------------------+-----------------------------+
| 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'); -- 正常數(shù)據(jù)
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,會(huì)自動(dòng)賦當(dāng)前時(shí)間
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'格式的字符串。允許“不嚴(yán)格”語(yǔ)法:任何標(biāo)點(diǎn)符都可以用做日期部分或時(shí)間部分之間的間割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等價(jià)的
'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。這里也允許使用“不嚴(yán)格的”語(yǔ)法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等價(jià)的。
'YYYYMMDD'或'YYMMDD'格式的沒有間割符的字符串,假定字符串對(duì)于日期類型是有意義的。例如,'19970523'和'970523'被解釋為 '1997-05-23',但'971332'是不合法的(它有一個(gè)沒有意義的月和日部分),將變?yōu)?#39;0000-00-00'。
YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的數(shù)字,假定數(shù)字對(duì)于日期類型是有意義的。例如,19830905132800和830905132800被解釋為 '1983-09-05 13:28:00'。
YYYYMMDD或YYMMDD格式的數(shù)字,假定數(shù)字對(duì)于日期類型是有意義的。例如,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'); -- 用不同的標(biāo)點(diǎn)符號(hào)做分隔符
Query OK, 1 row affected
mysql> SET sql_mode = ''; -- 設(shè)置非嚴(yán)格模式,只在該會(huì)話中有效
Query OK, 0 rows affected
mysql> SELECT @@sql_mode; -- 查看設(shè)置是否生效
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set
mysql> INSERT INTO t_date VALUES(4, 20180624151758, 180624151814, 20181324, '15:18:27', '2018'); -- 插入20181324時(shí)會(huì)自動(dòng)轉(zhuǎn)換為零值,前提是要設(shè)置非嚴(yán)格模式,否則報(bào)錯(cuò)
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類型可以用二位數(shù),也可以用四位數(shù)表示
四位字符串,范圍為'1901'到'2155'。
四位數(shù)字,范圍為1901到2155。
兩位字符串,范圍為'00'到'99'。'00'到'69'和'70'到'99'范圍的值被轉(zhuǎn)換為2000到2069和1970到1999范圍的YEAR值。
兩位整數(shù),范圍為1到99。1到69和70到99范圍的值被轉(zhuǎn)換為2001到2069和1970到1999范圍的YEAR值。請(qǐng)注意兩位整數(shù)范圍與兩位字符串范圍稍有不同,因?yàn)槟悴荒苤苯訉⒘阒付橐粋€(gè)字符串'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); -- 超出范圍轉(zhuǎn)換為零值
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表示定長(zhǎng),如CHAR(10)表示可以存儲(chǔ)10個(gè)字符,最大長(zhǎng)度為255個(gè)字符,當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
VARCHAR表示變長(zhǎng),如VARCHAR(10)表示可以存儲(chǔ)10個(gè)字符,最大長(zhǎng)度為65535個(gè)字符(VARCHAR的最大有效長(zhǎng)度由最大行大小和使用的字符集確定,實(shí)際最大長(zhǎng)度為65532個(gè)字符),與CHAR不同的是,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)表示字符的長(zhǎng)度(如果長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。
VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留。
下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果,說(shuō)明了CHAR和VARCHAR之間的差別:
請(qǐng)注意上表中最后一行的值只適用不使用嚴(yán)格模式時(shí);如果MySQL運(yùn)行在嚴(yán)格模式,超過(guò)列長(zhǎng)度不的值不保存,并且會(huì)出現(xiàn)錯(cuò)誤。
定長(zhǎng)的磁盤空間比較浪費(fèi), 但是效率高
相反的,變長(zhǎng)的磁盤空間比較節(jié)省, 但是效率低
BINARY與VARBINARY類型
BLOB與TEXT類型
通常超過(guò)255個(gè)字符的數(shù)據(jù)使用大文本進(jìn)行存儲(chǔ),根據(jù)存儲(chǔ)的數(shù)據(jù)格式分為BLOB與TEXT,BLOB用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)(少用),TEXT用來(lái)存儲(chǔ)文字。
BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長(zhǎng)度不同。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對(duì)應(yīng)4種BLOB類型,有相同的最大長(zhǎng)度和存儲(chǔ)需求。
ENUM類型
ENUM是一個(gè)字符串對(duì)象,其值來(lái)自表創(chuàng)建時(shí)在列規(guī)定中顯式枚舉的一列值,每個(gè)枚舉值有一個(gè)索引(NULL值的索引是NULL),從1開始編號(hào)
mysql> CREATE TABLE t_enum ( -- 創(chuàng)建枚舉表
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'); -- 不在枚舉定義的值里面,不允許插入,起到規(guī)范數(shù)據(jù)的作用
1265 - Data truncated for column 'gender' at row 1
如果在數(shù)值上下文中檢索一個(gè)ENUM值,將返回列值的索引。例如,你可以這樣從ENUM列搜索數(shù)值值:
mysql> SELECT gender + 0, gender FROM t_enum;
+------------+--------+
| gender + 0 | gender |
+------------+--------+
| 1 | man |
| 2 | woman |
+------------+--------+
2 rows in set
由于枚舉存儲(chǔ)的是數(shù)值,所以可以直接插入數(shù)值
mysql> INSERT INTO t_enum VALUES (1), (2); -- 直接插入數(shù)值
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類型
集合跟枚舉很類似,實(shí)際存儲(chǔ)的是數(shù)值(SET最多可以有64個(gè)不同的成員),而不是字符串,可以把集合看成是多選框,枚舉看成是單選
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用數(shù)字保存SET值,所保存值的低階位對(duì)應(yīng)第1個(gè)SET成員。如果在數(shù)值上下文中檢索一個(gè)SET值,檢索的值的位設(shè)置對(duì)應(yīng)組成列值的SET成員,例如,你可以這樣從一個(gè)SET列檢索數(shù)值值
mysql> SELECT letter + 0, letter FROM t_set;
+------------+--------+
| letter + 0 | letter |
+------------+--------+
| 3 | a,b |
| 7 | a,b,c |
+------------+--------+
2 rows in set
如果你為該列分配一個(gè)值9,其二進(jìn)制形式為1001,因此第1個(gè)和第4個(gè)SET值成員'a'和'd'被選擇,結(jié)果值為 'a,d'。
對(duì)于包含多個(gè)SET元素的值,當(dāng)插入值時(shí)元素所列的順序并不重要。在值中一個(gè)給定的元素列了多少次也不重要。當(dāng)以后檢索該值時(shí),值中的每個(gè)元素出現(xiàn)一次,根據(jù)表創(chuàng)建時(shí)指定的順序列出元素。例如,插入值'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; -- 檢索時(shí)所有的值將顯示為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()函數(shù)或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的成員,甚至是在另一個(gè)SET成員的子字符串中
+--------+
| letter |
+--------+
| a,b |
| a,b,c |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+--------+
7 rows in set
總結(jié)
以上是生活随笔為你收集整理的mysql里面有没有map类型_MySQL学习(二) 数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 余额宝和零钱通哪个收益高 余额宝跟零钱通
- 下一篇: 怎么查POS机是否跳码?刷卡商户MCC码