MySQL支持全部標準SQL數值數據類型。
這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
MySQL支持的整數類型有TINYINT、MEDIUMINT和BIGINT。下面的表顯示了須要的每一個整數類型的存儲和範圍。
對於小數的表示,MySQL分爲兩種方式:浮點數和定點數。浮點數包括float(單精度)和double(雙精度),而定點數只有decimal一種,在MySQL中以字符串的形式存放,比浮點數更精確,適合用來表示貨幣等精度高的數據。
BIT數據類型保存位字段值,而且支持MyISAM、MEMORY、InnoDB和BDB表
# 建立表一個是默認寬度的int,一個是指定寬度的int(5) mysql> create table t1 (id1 int,id2 int(5)); Query OK, 0 rows affected (0.02 sec) # 像t1中插入數據1,1 mysql> insert into t1 values (1,1); Query OK, 1 row affected (0.01 sec) # 能夠看出結果上並無異常 mysql> select * from t1; +------+------+ | id1 | id2 | +------+------+ | 1 | 1 | +------+------+ row in set (0.00 sec) # 那麼當咱們插入了比寬度更大的值,會不會發生報錯呢? mysql> insert into t1 values (111111,111111); Query OK, 1 row affected (0.00 sec) # 答案是否認的,id2仍然顯示了正確的數值,沒有受到寬度限制的影響 mysql> select * from t1; +------------+--------+ | id1 | id2 | +------------+--------+ | 0000000001 | 00001 | | 0000111111 | 111111 | +------------+--------+ rows in set (0.00 sec) # 修改id1字段 給字段添加一個unsigned表示無符號 unsigned 就是將數字類型無符號化, 例如 int 型的範圍:-2^31 ~ 2^31 - 1,而unsigned int的範圍:0 ~ 2^32。看起來unsigned 是個不錯的類型 mysql> alter table t1 modify id1 int unsigned; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc t1; +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+ | id1 | int(10) unsigned | YES | | NULL | | | id2 | int(5) | YES | | NULL | | +-------+------------------+------+-----+---------+-------+ rows in set (0.01 sec) # 當給id1添加的數據大於214748364時,能夠順利插入 mysql> insert into t1 values (2147483648,2147483647); Query OK, 1 row affected (0.00 sec) # 當給id2添加的數據大於214748364時,會報錯 mysql> insert into t1 values (2147483647,2147483648); ERROR 1264 (22003): Out of range value for column 'id2' at row 1
float類型表示單精度浮點數值,double類型表示雙精度浮點數值,float和double都是浮點型,而decimal是定點型;
DECIMAL數據類型用於在數據庫中存儲精確的數值。咱們常常將DECIMAL數據類型用於保留準確精確度的列,例如會計系統中的貨幣數據mysql
double是mysql浮點類型數據的一種,double(6,2)表示規定顯示的值不會超過6位數字,小數點後面帶有2位數字sql
MySQL 浮點型和定點型能夠用類型名稱後加(M,D)來表示,M表示該值的總共長度,D表示小數點後面的長度,M和D又稱爲精度和標度,如float(5,2)的
可顯示爲999.99,MySQL保存值時會進行四舍五數據庫
# 建立表的三個字段分別爲float,double和decimal參數表示一共顯示5位,小數部分佔2位 mysql> create table t2 (id1 float(5,2),id2 double(5,2),id3 decimal(5,2)); Query OK, 0 rows affected (0.02 sec) # 向表中插入1.23,結果正常 mysql> insert into t2 values (1.23,1.23,1.23); Query OK, 1 row affected (0.00 sec) mysql> select * from t2; +------+------+------+ | id1 | id2 | id3 | +------+------+------+ | 1.23 | 1.23 | 1.23 | +------+------+------+ row in set (0.00 sec) # 向表中插入1.234,會發現4都被截斷了 mysql> insert into t2 values (1.234,1.234,1.234); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t2; +------+------+------+ | id1 | id2 | id3 | +------+------+------+ | 1.23 | 1.23 | 1.23 | | 1.23 | 1.23 | 1.23 | +------+------+------+ rows in set (0.00 sec) # 向表中插入1.235發現數據雖然被截斷,可是遵循了四捨五入的規則 mysql> insert into t2 values (1.235,1.235,1.235); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t2; +------+------+------+ | id1 | id2 | id3 | +------+------+------+ | 1.23 | 1.23 | 1.23 | | 1.23 | 1.23 | 1.23 | | 1.24 | 1.24 | 1.24 | +------+------+------+ rows in set (0.00 sec) # 建新表去掉參數約束 mysql> create table t3 (id1 float,id2 double,id3 decimal); Query OK, 0 rows affected (0.02 sec) # 分別插入1.234 mysql> insert into t3 values (1.234,1.234,1.234); Query OK, 1 row affected, 1 warning (0.00 sec) # 發現decimal默認值是(10,0)的整數 mysql> select * from t3; +-------+-------+------+ | id1 | id2 | id3 | +-------+-------+------+ | 1.234 | 1.234 | 1 | +-------+-------+------+ row in set (0.00 sec) # 當對小數位沒有約束的時候,輸入超長的小數,會發現float和double的區別 mysql> insert into t3 values (1.2355555555555555555,1.2355555555555555555,1.2355555555555555555555); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t3; +---------+--------------------+------+ | id1 | id2 | id3 | +---------+--------------------+------+ | 1.234 | 1.234 | 1 | | 1.23556 | 1.2355555555555555 | 1 | +---------+--------------------+------+ rows in set (0.00 sec)
表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每一個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。 TIMESTAMP類型有專有的自動更新特性,將在後面描述。
日期類型:系統使用三個字節來存儲數據,對應的格式爲:YYYY-mm-dd,能表示的範圍是從1000-01-01 到9999-12-12,初始值爲0000-00-00spa
時間類型:可以表示某個指定的時間,可是系統一樣是提供3個字節來存儲,對應的格式爲:HH:ii:ss,可是mysql中的time類型可以表示時間範圍要大的多,設計
能表示從-838:59:59~838:59:59,在mysql中具體的用處是用來描述時間段。3d
Datetime:
日期時間類型:就是將前面的date和time合併起來,表示的時間,使用8個字節存儲數據,格式爲YYYY-mm-dd HH:ii:ss,code
能表示的區間1000-01-01 00:00:00 到9999-12-12 23:59:59,其能夠爲0值:0000-00-00 00:00:00對象
mysql> create table t4 (d date,t time,dt datetime); Query OK, 0 rows affected (0.02 sec) mysql> desc t4; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | d | date | YES | | NULL | | | t | time | YES | | NULL | | | dt | datetime | YES | | NULL | | +-------+----------+------+-----+---------+-------+ rows in set (0.01 sec) mysql> insert into t4 values (now(),now(),now()); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t4; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 | +------------+----------+---------------------+ row in set (0.00 sec) mysql> insert into t4 values (null,null,null); Query OK, 1 row affected (0.01 sec) mysql> select * from t4; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 | | NULL | NULL | NULL | +------------+----------+---------------------+ rows in set (0.00 sec)
print("***************************************************************************************")
mysql> create table t8 (dt datetime); Query OK, 0 rows affected (0.01 sec) mysql> insert into t8 values ('2018-9-26 12:20:10'); Query OK, 1 row affected (0.01 sec) mysql> insert into t8 values ('2018/9/26 12+20+10'); Query OK, 1 row affected (0.00 sec) mysql> insert into t8 values ('20180926122010'); Query OK, 1 row affected (0.00 sec) mysql> insert into t8 values (20180926122010); Query OK, 1 row affected (0.00 sec) mysql> select * from t8; +---------------------+ | dt | +---------------------+ | 2018-09-26 12:20:10 | | 2018-09-26 12:20:10 | | 2018-09-26 12:20:10 | | 2018-09-26 12:20:10 | +---------------------+ rows in set (0.00 sec)
.timestampblog
佔用4個字節
2. 容許爲空值,可是不能夠自定義值,因此爲空值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。這說明一個日期,例如'1968-01-01',雖然對於DATETIME或DATE值是有效的,但對於TIMESTAMP值卻無效,若是分配給這樣一個對象將被轉換爲0。
4.值以UTC格式保存( it stores the number of milliseconds)排序
5.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。
6. 默認值爲CURRENT_TIMESTAMP(),其實也就是當前的系統時間。
7. 數據庫會自動修改其值,因此在插入記錄時不須要指定timestamp字段的名稱和timestamp字段的值,你只須要在設計表的時候添加一個timestamp字段便可,插入後該字段的值會自動變爲當前系統時間。
8. 默認狀況下之後任什麼時候間修改表中的記錄時,對應記錄的timestamp值會自動被更新爲當前的系統時間。
9. 若是須要能夠設置timestamp不自動
mysql> createtable t5 (id1 timestamp);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t5;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id1 | timestamp | NO | | CURRENT_TIMESTAMP | on updateCURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+rowinset (0.00 sec)
# 插入數據null,會自動插入當前時間的時間
mysql> insertinto t5 values (null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+---------------------+
| id1 |
+---------------------+
| 2018-09-21 14:56:50 |
+---------------------+
row in set (0.00 sec)
#添加一列 默認值是'0000-00-00 00:00:00'
mysql> altertable t5 add id2 timestamp;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> showcreatetable t5 \G;
*************************** 1. row ***************************
Table: t5
CreateTable: CREATETABLE`t5` (
`id1`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,
`id2`timestampNOTNULLDEFAULT'0000-00-00 00:00:00'
) ENGINE=InnoDBDEFAULTCHARSET=utf8
rowinset (0.00 sec)
ERROR:
Noquery specified
# 手動修改新的列默認值爲當前時間
mysql> altertable t5 modify id2 timestampdefaultcurrent_timestamp;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> showcreatetable t5 \G;
*************************** 1. row ***************************
Table: t5
CreateTable: CREATETABLE`t5` (
`id1`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,
`id2`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP
) ENGINE=InnoDBDEFAULTCHARSET=utf8
rowinset (0.00 sec)
ERROR:
Noquery specified
mysql> insertinto t5 values (null,null);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2018-09-21 14:56:50 | 0000-00-00 00:00:00 |
| 2018-09-21 14:59:31 | 2018-09-21 14:59:31 |
+---------------------+---------------------+
rows in set (0.00 sec)
print("**********************************************************************************************************************************************")
mysql> createtable t6 (t1 timestamp);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t6;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| t1 | timestamp | NO | | CURRENT_TIMESTAMP | on updateCURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+rowinset (0.01 sec)
mysql> insertinto t6 values (19700101080001);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t6;
+---------------------+
| t1 |
+---------------------+
| 1970-01-01 08:00:01 |
+---------------------+
row in set (0.00 sec)
# timestamp時間的下限是19700101080001
mysql> insertinto t6 values (19700101080000);
ERROR 1292 (22007): Incorrect datetime value: '19700101080000' for column 't1' at row 1
mysql> insertinto t6 values ('2038-01-19 11:14:07');
Query OK, 1 row affected (0.00 sec)
# timestamp時間的上限是2038-01-19 11:14:07
mysql> insertinto t6 values ('2038-01-19 11:14:08');
ERROR 1292 (22007): Incorrect datetime value: '2038-01-19 11:14:08' for column 't1' at row 1
mysql>
year
mysql> create table t7 (y year); Query OK, 0 rows affected (0.02 sec) mysql> insert into t7 values (2018); Query OK, 1 row affected (0.00 sec) mysql> select * from t7; +------+ | y | +------+ | 2018 | +------+ row in set (0.00 sec)
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工做以及如何在查詢中使用這些類型。
HAR 和 VARCHAR 類型相似,但它們保存和檢索的方式不一樣。它們的最大長度和是否尾部空格被保留等方面也不一樣。在存儲或檢索過程當中不進行大小寫轉換。
CHAR列的長度固定爲建立表是聲明的長度,範圍(0-255);而VARCHAR的值是可變長字符串範圍(0-65535)
char 固定長度 數據類型
varchar 可變長度 數據類型
mysql> create table t9 (v varchar(4),c char(4)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t9 values ('ab ','ab '); Query OK, 1 row affected (0.00 sec) # 在檢索的時候char數據類型會去掉空格 mysql> select * from t9; +------+------+ | v | c | +------+------+ | ab | ab | +------+------+ row in set (0.00 sec) # 來看看對查詢結果計算的長度 mysql> select length(v),length(c) from t9; +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 2 | +-----------+-----------+ row in set (0.00 sec) # 給結果拼上一個加號會更清楚 mysql> select concat(v,'+'),concat(c,'+') from t9; +---------------+---------------+ | concat(v,'+') | concat(c,'+') | +---------------+---------------+ | ab + | ab+ | +---------------+---------------+ row in set (0.00 sec) # 當存儲的長度超出定義的長度,會截斷 mysql> insert into t9 values ('abcd ','abcd '); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t9; +------+------+ | v | c | +------+------+ | ab | ab | | abcd | abcd | +------+------+ rows in set (0.00 sec)
BINARY 和 VARBINARY 相似於 CHAR 和 VARCHAR,不一樣的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,
而且排序和比較基於列值字節的數值值。 BLOB 是一個二進制大對象,能夠容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不一樣。 有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不一樣,可根據實際狀況選擇。
enum ENUM只能取單值,它的數據列表是一個枚舉集合。它的合法取值列表最多容許有65535個成員。例如:ENUM("N","Y")表示,該數據列的取值要麼是"Y",要麼就是"N"
set SET可取多值。它的合法取值列表最多容許有64個成員。空字符串也是一個合法的SET值。
mysql> create table t10 (name char(20),gender enum('female','male')); Query OK, 0 rows affected (0.01 sec) # 選擇enum('female','male')中的一項做爲gender的值,能夠正常插入 mysql> insert into t10 values ('nick','male'); Query OK, 1 row affected (0.00 sec) # 不能同時插入'male,female'兩個值,也不能插入不屬於'male,female'的值 mysql> insert into t10 values ('nick','male,female'); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 mysql> create table t11 (name char(20),hobby set('抽菸','喝酒','燙頭','翻車')); Query OK, 0 rows affected (0.01 sec) # 能夠任意選擇set('抽菸','喝酒','燙頭','翻車')中的項,並自帶去重功能 mysql> insert into t11 values ('tank','燙頭,喝酒,燙頭'); Query OK, 1 row affected (0.01 sec) mysql> select * from t11; +------+---------------+ | name | hobby | +------+---------------+ | tank | 喝酒,燙頭 | +------+---------------+ row in set (0.00 sec) # 不能選擇不屬於set('抽菸','喝酒','燙頭','翻車')中的項, mysql> insert into t11 values ('jason','燙頭,翻車,看妹子'); ERROR 1265 (01000): Da