2Python全栈之路系列之MysQl基本数据类型
Python全棧之路系列之MySQL基本數(shù)據(jù)類型
MySQL中定義數(shù)據(jù)字段的類型對你數(shù)據(jù)庫的優(yōu)化是非常重要的。
MySQL支持多種類型,大致可以分為三類:
數(shù)字類型
日期和時間類型
字符串類型
數(shù)字類型
| BIT | - | 二進制 |
| TINYINT | 1字節(jié) | 小整數(shù)值 |
| INT or INTEGER | 4字節(jié) | 大整數(shù)值 |
| BIGINT | 8字節(jié) | 極大整數(shù)值 |
| DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 小數(shù)值 |
| FLOAT | 4字節(jié) | 單精度浮點數(shù)值 |
| DOUBLE | 8字節(jié) | 雙精度浮點數(shù)值 |
| BOOL, BOOLEAN | - | 布爾值 |
-
BIT[(M)]
二進制位(101001),m表示二進制位的長度(1-64),默認m=1
-
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
小整數(shù),數(shù)據(jù)類型用于保存一些范圍的整數(shù)數(shù)值范圍:
| -128 to 127 | 0 to 255 |
特別的: MySQL中無布爾值,使用tinyint(1)構(gòu)造。
-
INT[(M)] [UNSIGNED] [ZEROFILL]
整數(shù),數(shù)據(jù)類型用于保存一些范圍的整數(shù)數(shù)值范圍:
| -2147483648 to 2147483647 | 0 to 4294967295 |
整數(shù)類型中的m僅用于顯示,對存儲范圍無限制。例如:?int(5),當插入數(shù)據(jù)2時,select時數(shù)據(jù)顯示為:00002
-
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大整數(shù),數(shù)據(jù)類型用于保存一些范圍的整數(shù)數(shù)值范圍:
| -9223372036854775808 to 9223372036854775807 | 0 to 18446744073709551615 |
-
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
準確的小數(shù)值,m是數(shù)字總個數(shù)(負號不算),d是小數(shù)點后個數(shù)。 m最大值為65,d最大值為30。
特別的:對于精確數(shù)值計算時需要用此類型decaimal能夠存儲精確值的原因在于其內(nèi)部按照字符串存儲。
-
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
單精度浮點數(shù)(非準確小數(shù)值),m是數(shù)字總個數(shù),d是小數(shù)點后個數(shù)。
-
無符號:
-3.402823466E+38 to -1.175494351E-38,
0
1.175494351E-38 to 3.402823466E+38 -
有符號:
0
1.175494351E-38 to 3.402823466E+38
數(shù)值越大,越不準確
-
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
雙精度浮點數(shù)(非準確小數(shù)值),m是數(shù)字總個數(shù),d是小數(shù)點后個數(shù)。
-
無符號:
-1.7976931348623157E+308 to -2.2250738585072014E-308
0
2.2250738585072014E-308 to 1.7976931348623157E+308 -
有符號:
0
2.2250738585072014E-308 to 1.7976931348623157E+308
數(shù)值越大,越不準確
-
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 HHSS | 混合日期和時間值 |
| TIMESTAMP | 8 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
| TIME | 3 | HHSS | 時間值或持續(xù)時間 |
| 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 | 固定長度的字符串,即使數(shù)據(jù)小于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)使用起來較為靈活,但是從整個系統(tǒng)的性能角度來說,CHAR(M)數(shù)據(jù)類型的處理速度更快,有時甚至可以超出VARCHAR(M)處理速度的50%。因此,用戶在設計數(shù)據(jù)庫時應當綜合考慮各方面的因素,以求達到最佳的平衡
-
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或更多個值,每個值均必須選自一個允許值列表中,該列表在表創(chuàng)建時被指定。
| 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) |
本文轉(zhuǎn)自 Edenwy? 51CTO博客,原文鏈接:http://blog.51cto.com/edeny/1925859,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的2Python全栈之路系列之MysQl基本数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的女朋友漏电了–论C++中的失败(fa
- 下一篇: 一次前端笔试总结