MySQL—MySQL資料庫支援的資料型別
在資料庫中,資料型別對於設計資料庫者來說十分重要,記得在一次資料庫大會上,某前輩說了這麼一句話:“如果是我面試DBA,我第一個問題就是關於tinyint、smallint、mediumint、int、bigint的區別,如果這些不能詳細解釋,後面不管他表現的多好,我不會考慮”,從這裡可以理解掉MySQL的資料型別是多麼重要,很多人特別是開發人員往往不會關注這方面,從理解上大家會任務資料庫對記憶體等方面要求很高,這些資料型別並不是很重要,其實他忽略了一個關鍵的因素,磁碟IO,如果資料型別設定的不合理,會佔用很大的磁碟空間,會給資料帶來IO上得瓶頸,下面我們就詳細的學習下MySQL支援的資料型別
1:數值型別
整數型別
位元組
最小值
最大值
TINYINT
1
有符號-128
無符號0
有符號127
無符號255
SMLLINT
2
有符號-32768
無符號0
有符號32767
無符號65535
MEDIUMINT
3
有符號-8388608
無符號0
有符號8388607
無符號16777215
INT、INTEGER
4
有符號-2147483748
無符號0
有符號2147483747
無符號4294967295
BIGINT
8
有符號-9223372036854775808
無符號0
有符號9223372036854775807
無符號18446744073709551615
浮點數型別
位元組
最小值
最大值
FLOAT
4
+_1.17549435-38
+_3.402823466E+38
DOUBLE
8
+_2.225073858507204E-308
+_1.7976931348623157E+308
在整數型別著中,按照取值範圍和儲存方式不同,分為tinyint、smallint、 mediumint、int、bigint這5個型別,如果超出類型範圍的操縱,會發生“out of range”錯誤提示。為了避免此類問題發生,在選擇資料型別時要根據應用的實際請客確定其取值範圍,最後根據確定的結果慎重選擇資料型別
所有的整數型別都有一個可選屬性UNSIGNED(無符號),如果需要在欄位裡面儲存非負數或者需要較大的上限值時,可以用此選項,他的取值範圍是正常值的下限取0,上限取原值的2倍
另外,整數型別還有一個屬性,AUTO_IMCREMENT。在需要產生唯一標示符或順序值時,可利用此屬性,這個屬性只用於整數型別,AUTO_INCREMENT值一般從1開始,每行加1
2:日期時間型別
MySQL中友很多種資料型別可以用於日期和時間的表示,不同的版本可能有所差異,下表列出5.0所支援的日期和時間型別
日期和時間型別
位元組
最小值
最大值
DATE
4
1000-01-01
9999-12-31
DATETIME
8
1000-01-01 00:00:00
9999-12-31 23:59:59
TIMESTAMP
4
19700101080001
2038年的某個時刻
TIME
3
-838:59:59
838:59:59
YEAR
1
1901
2155
上述型別,除了TIMESTAMP外都容易理解,下面我們就TIMESTAMP和DATETIME進行對比
1:TIMESTAMP支援的時間範圍小,其取值範圍從19700101080001到2038年的某個時刻,而DATETIME是從1000-01-01 00:00:00到9999-12-31 23:59:59,範圍更大
2:表中的第一個TIMESTAMP列自動設定為系統時間,如果在一個TIMESTAMP中插入NULL,則該列賦值將自動設定為當前的日期和時間,再插入或者更新一行但不明確給TIMESTAMP列賦值時也會子偶那個設定該列的當前的時間和日期,當插入的值超出取值範圍,MySQL認為該值溢位,使用“0000-00-00 00:00:00”進行填補
3:TIMESTAMP的插入和查詢都受當地時區的影響,更能反應出實際的日期。而DATETIME則只能反應出插入時當地的時區,其他時區的人檢視資料必然會受到影響
4:TIMESTAMP的屬性受MySQL版本和伺服器SQLMode的影響很大
3:字串型別
MySQL提供了很多種對字元資料的儲存型別,下表就詳細進行了對比
字串型別
位元組
描述及儲存需求
CHAR(M)
M
M為0~255之間的整數
VARCHAR(M)
M為0~65535之間的整數,值的長度+1個位元組
TINYBLOB
允許長度0~255位元組,值的長度+1個位元組
BLOB
允許長度0~65535位元組,值的長度+2個位元組
MEDIUMBLOB
允許長度0~167772150,值的長度+3個位元組
LONGBLOB
允許長度0~4294967395,值的長度+4個位元組
TINYTEXT
允許長度0~255,值的長度+2個位元組
TEXT
允許長度0~65535位元組,值的長度+2個位元組
MEDIUMTEXT
允許長度0~167772150,值的長度+3個位元組
LONGTEXT
允許長度0~4294967395,值的長度+4個位元組
VARBINARY( M)
允許長度0~M個位元組的變長字串,值的長度+1個位元組
BINARY(M)
M
允許長度0~M個位元組的變長字串
CHAR和VARCHAR型別
CHAR和VARCHAR很類似,都用來儲存MySQL中較短的字串,二者的主要區別在於儲存方式的不同,CHAR列的長度固定為建立表時的長度,長度可以為從0~255任何值。而VARCHAR列中的值為可變長字串,長度可以為指定的0~255或者65535之間的值。在檢索的時候,CHAR列刪除了尾部的空格,而VARCHAR保留了這些空格。會造成索引儲存大小上的變化,所以在設定這個型別的時候一定要慎重,充分分析現有業務
BINARY和VARBINARY型別
BINARY和VARBINARY類似於CHAR和VARCHAR,不同的是它們包含二進位制串而不包含非二進位制字串。
TEXT和BOLB型別
這2種主要用於儲存一些大欄位類似於圖片等,慎用……