Python全棧之路系列之MySQL基本數據類型
MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。
MySQL支持多種類型,大致可以分為三類:
-
數字類型
-
日期和時間類型
-
字符串類型
數字類型
類型 | 大小 | 用途 |
---|---|---|
BIT | - | 二進制 |
TINYINT | 1字節 | 小整數值 |
INT or INTEGER | 4字節 | 大整數值 |
BIGINT | 8字節 | 極大整數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 小數值 |
FLOAT | 4字節 | 單精度浮點數值 |
DOUBLE | 8字節 | 雙精度浮點數值 |
BOOL, BOOLEAN | - | 布爾值 |
-
BIT[(M)]
二進制位(101001),m表示二進制位的長度(1-64),默認m=1
-
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
小整數,數據類型用于保存一些范圍的整數數值范圍:
范圍(有符號) | 范圍(無符號) |
---|---|
-128 to 127 | 0 to 255 |
特別的: MySQL中無布爾值,使用tinyint(1)構造。
-
INT[(M)] [UNSIGNED] [ZEROFILL]
整數,數據類型用于保存一些范圍的整數數值范圍:
范圍(有符號) | 范圍(無符號) |
---|---|
-2147483648 to 2147483647 | 0 to 4294967295 |
整數類型中的m僅用于顯示,對存儲范圍無限制。例如:?int(5)
,當插入數據2時,select
時數據顯示為:00002
-
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大整數,數據類型用于保存一些范圍的整數數值范圍:
范圍(有符號) | 范圍(無符號) |
---|---|
-9223372036854775808 to 9223372036854775807 | 0 to 18446744073709551615 |
-
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
準確的小數值,m是數字總個數(負號不算),d是小數點后個數。 m最大值為65,d最大值為30。
特別的:對于精確數值計算時需要用此類型decaimal能夠存儲精確值的原因在于其內部按照字符串存儲。
-
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
單精度浮點數(非準確小數值),m是數字總個數,d是小數點后個數。
-
無符號:
-3.402823466E+38 to -1.175494351E-38,
0
1.175494351E-38 to 3.402823466E+38
-
有符號:
0
1.175494351E-38 to 3.402823466E+38
數值越大,越不準確
-
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
雙精度浮點數(非準確小數值),m是數字總個數,d是小數點后個數。
-
無符號:
-1.7976931348623157E+308 to -2.2250738585072014E-308
0
2.2250738585072014E-308 to 1.7976931348623157E+308
-
有符號:
0
2.2250738585072014E-308 to 1.7976931348623157E+308
數值越大,越不準確
-
BOOL, BOOLEAN
這些類型是TINYINT
的同義詞。零值被認為是假的。非零值被認為是正確的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | mysql>? SELECT ?IF(0,? 'true' ,? 'false' ); + ------------------------+ |?IF(0,? 'true' ,? 'false' )?| + ------------------------+ |? false ??????????????????| + ------------------------+ 1?row? in ?set ?(0.00?sec) mysql>? SELECT ?IF(1,? 'true' ,? 'false' ); + ------------------------+ |?IF(1,? 'true' ,? 'false' )?| + ------------------------+ |? true ???????????????????| + ------------------------+ 1?row? in ?set ?(0.00?sec) mysql>? SELECT ?IF(2,? 'true' ,? 'false' ); + ------------------------+ |?IF(2,? 'true' ,? 'false' )?| + ------------------------+ |? true ???????????????????| + ------------------------+ 1?row? in ?set ?(0.00?sec) |
然而,真假的值僅僅是為了分別為1和0,別名,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | mysql>?SELECT?IF( 0 ?= ?FALSE,? 'true' ,? 'false' ); + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?IF( 0 ?= ?FALSE,? 'true' ,? 'false' )?| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?true???????????????????????????| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 ?row? in ?set ?( 0.01 ?sec) mysql>?SELECT?IF( 1 ?= ?TRUE,? 'true' ,? 'false' ); + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?IF( 1 ?= ?TRUE,? 'true' ,? 'false' )?| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?true??????????????????????????| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 ?row? in ?set ?( 0.00 ?sec) mysql>?SELECT?IF( 2 ?= ?TRUE,? 'true' ,? 'false' ); + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?IF( 2 ?= ?TRUE,? 'true' ,? 'false' )?| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?false?????????????????????????| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 ?row? in ?set ?( 0.00 ?sec) mysql>?SELECT?IF( 2 ?= ?FALSE,? 'true' ,? 'false' ); + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?IF( 2 ?= ?FALSE,? 'true' ,? 'false' )?| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |?false??????????????????????????| + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 ?row? in ?set ?( 0.00 ?sec) |
時間類型
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間類型有一個有效值范圍和一個”零”值,當指定不合法的MySQL不能表示的值時使用”零”值。
類型 | 大小(字節) | 格式 | 用途 |
---|---|---|---|
DATE | 3 | YYYY-MM-DD | 日期值 |
DATETIME | 8 | YYYY-MM-DD HH | 混合日期和時間值 |
TIMESTAMP | 8 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
TIME | 3 | HH | 時間值或持續時間 |
YEAR | 1 | YYYY | 年份值 |
類型 | 范圍 |
---|---|
DATE | '1000-01-01' to '9999-12-31' |
DATETIME | '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999' |
TIMESTAMP | '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' |
TIME | '-838:59:59.000000' to '838:59:59.000000' |
YEAR | 1901 to 2155 |
字符串類型
類型 | 大小(字節) | 用途 |
---|---|---|
CHAR(M) | 0 to 255 | 固定長度的字符串,即使數據小于M長度,也會占用M長度 |
VARCHAR(M) | 0 to 65535 | 一個可變長度的字符串,M表示在字符的最大列長度 |
TEXT[(M)] | 0 to 65535 | 長文本列 |
MEDIUMTEXT | 0 to 16777215 | 中等長度文本列 |
LONGTEXT | 4294967295 or 4GB | 極大文本列 |
ENUM('value1','value2',...) | 枚舉類型 | |
SET('value1','value2',...) | 集合類型 |
-
VARCHAR(M)注
雖然VARCHAR(M)
使用起來較為靈活,但是從整個系統的性能角度來說,CHAR(M)
數據類型的處理速度更快,有時甚至可以超出VARCHAR(M)
處理速度的50%。因此,用戶在設計數據庫時應當綜合考慮各方面的因素,以求達到最佳的平衡
-
ENUM('value1','value2',...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | CREATE ?TABLE ?shirts?( ???? name ?VARCHAR (40), ???? size ?ENUM( 'x-small' ,? 'small' ,? 'medium' ,? 'large' ,? 'x-large' ) ); INSERT ?INTO ?shirts?( name ,? size )? VALUES ?( 'dress?shirt' , 'large' ),?( 't-shirt' , 'medium' ), ?? ( 'polo?shirt' , 'small' ); ?? ?mysql>? SELECT ?name ,? size ?FROM ?shirts? WHERE ?size ?=? 'medium' ; + ---------+--------+ |? name ????|? size ???| + ---------+--------+ |?t-shirt?|?medium?| + ---------+--------+ 1?row? in ?set ?(0.00?sec) UPDATE ?shirts? SET ?size ?=? 'small' ?WHERE ?size ?=? 'large' ; COMMIT ; |
-
SET('value1','value2',...)
SET是一個字符串對象,它可以有0
或更多
個值,每個值均必須選自一個允許值列表中,該列表在表創建時被指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | mysql>? CREATE ?TABLE ?myset?(col? SET ( 'a' ,? 'b' ,? 'c' ,? 'd' )); Query?OK,?0? rows ?affected?(0.01?sec) 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 mysql>? SELECT ?col? FROM ?myset; + ------+ |?col??| + ------+ |?a,d??| |?a,d??| |?a,d??| |?a,d??| |?a,d??| + ------+ 5? rows ?in ?set ?(0.00?sec) |