1. 程式人生 > >MySQL—MySQL資料庫支援的資料型別

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種主要用於儲存一些大欄位類似於圖片等,慎用……