Mysql筆記之 數據類型

Mysql筆記之 數據類型

1.整型類型:

類型名稱 存儲需求
TINYINT 1個字節
SMALLINT 2個字節
MEDIUMINT 3個字節
INT(INTEGER) 4個字節
BIGINT 8個字節

注意:

CREATE TABLE tb(
    id  INT(11),
    name VARCHAR(25)
)

說明:以上建表語句中INT(11)
其中11表示的是該數據類型指定的顯示寬度,指定能夠顯示的數值中數字的個數。
顯示寬度和數據類型的取值範圍是無關的。顯示寬度只是指明mysql最大可能顯示的數字個數,數值的位數小於指定的寬度時會由空格填充。如果插入了大於顯示寬度的值,只要該值不超過該類型整數的取值範圍,數值依然可以插入,而且能夠顯示出來。
顯示寬度只是用於顯示,並不能限制取值範圍和佔用空間。


2.浮點數類型和定點數類型

類型名稱 存儲需求
FLOAT 4個字節
DOUBLE 8個字節
DECIMAL(M,D),DEC M+2個字節

解釋
1.FLOAT和DOUBLE分別爲單精度浮點類型和雙進度浮點類型
2.DECIMAL爲定點類型
3.浮點類型和定點類型都可以用(M,N)來表示,其中M稱爲精度,表示有多少位
N稱爲標度,是表示小數的位數。
4.不論是定點類型學還是浮點類型,如果用戶指定的精度超出精度範圍,則四捨五入

注意:
在mysql中,定點數以字符串形式存儲,在對精度比較高的時候,例如貨幣,使用DECIMAL比較好。還有要避免做浮點數的比較,和運算。


3.日期和時間類型

類型名稱 日期格式 存儲需求
YEAR YYYY 1個字節
TIME HH:MM:SS 3個字節
DATE YYYY-MM-DD 3個字節
DATETIME YYYY-MM-DD HH:MM:SS 8個字節
TIMESTAMP YYYY-MM-DD HH:MM:SS 4個字節

1.YEAR 類型是一個單字節類型用於表示年,在存儲時只需要1個字節。
2.TIME 類型用在只需要時間信息的值,在存儲時需要3個字節。
3.DATE 類型用在僅需要日期時,沒有時間部分,需要3個字節存儲。
4.DATETIME 類型用在需要同時包含日期和時間信息的值,在存儲時需要8個字節。
5.TIMESTAMP 類型的顯示格式和DATETIME相同,顯示寬度固定在19個字符,存儲需要4個字節,但取值範圍比DATETIME小

DATETIME的取值範圍爲‘1000-01-01 00:00:00’~’9999-12-3 23:59:59’
TIMESTAMP的取值範圍爲‘1970-01-01 00:00:01’UTC~’2038-01-19 03:14:07’UTC

注意:
TIMESTAMP與DATETIME除了存儲字節和支持的範圍不同外,還有一個最大的區別就是DATETIME在存儲日期數據時,按實際輸入的格式存儲,即輸入什麼就存儲什麼,與時區無關;而TIMESTAMP值的存儲是以UTC(世界標準時間)格式保存的,存儲時對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時,根據當前時區的不同,顯示的時間值是不同的。

在TIME,或DATE類中的字段中插入當前時間,可以用CURRENT_DATE() 或NOW()
在DATETIME或TIMESTAMP的字段中插入當前時間,可以使用NOW()


4.字符串類型

類型名稱 說明 存儲需求
CHAR(M) 固定長度非二進制字符串 M字節,1<=M<=255
VARCHAR(M) 變長非二進制字符串 L+1字節,在此L<=M和1<=M<=255
TINYTEXT 非常小的非二進制字符串 L+1字節,在此L<2^8
TEXT 小的非二進制字符串 L+2字節,在此L<2^16
MEDIUMENT 中等大小的非二進制字符串 L+3字節,在此L<2^24
LONGTEXT 大的非二進制字符串 L+4字節,在此L<2^32
ENUM 枚舉類型,只能有一個枚舉字符串值 1或2個字節,取決於枚舉值的數目
SET 一個設置,字符串對象可以由零個或多個SET成員 1,2,3,4或8個字節,取決與集合成員的數量(最多84個成員)

例:
一個VARCHAR(10)列能保存最大 長度爲10個字符的一個字符串,實際的存儲需要是字符串的長度L,加上1個字節以記錄字符串的長度,對於字符”abcd”,L是4而存儲要求是5個字節。

注意
1.VARCHAR ,BLOB和TEXT類型是變長類型
2.CHAR類型,尾部的空格將被刪除掉
3.VARCHAR類型,值在保存和檢索時尾部的空格仍保留。
4.TEXT列保存非二進制字符串,如文章內容、評論。當保存或查詢TEXT列的值是,不刪除尾部的空格
5.TINYTEXT 最大長度爲255字符的TEXT列
6.TEXT最大長度爲65535字符的TEXT列
7.MEDIUMTEXT最大長度爲16777215字符的TEXT列
8.LONGTEXT最大長度爲4294967295或4GB字符的TEXT列


5.二進制類型

類型名稱 說明 存儲需求
BIT(M) 位字段類型 大約(M+7)/8個字節
BINARY(M) 固定長度二進制字符串 M個字節
VARBINARY(M) 可變長度二進制字符串 M+1個字節
TINYBLOB(M) 非常小的BLOB L+1字節,在此L<2^8
BLOB(M) 小BLOB L+2字節,在此L<2^16
MEDIUMBLOB(M) 中等大小的BLOB L+3字節,在此L<2^24
LONGBLOB(M) 非常大的BLOB L+4字節,在此L<2^32

提示 :BIN()函數將數字轉換爲二進制。

BINARY和VARBINARY 類型類似於CHAR和VARCHAR,不同的是他們包含二進制字節字符串。
BLOB是一個二進制大對象,用來存儲可變數量的數據。BLOB類型分爲TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB 他們可容納值的最大長度不同 。
BLOB列存儲的是二進制字符串;TEXT列存儲的是非二進制字符串。BLOB列沒有字符集,並且排序和比較基於列值字節的數值;TEXT列有一個字符集,並且根據字符集對值進行排序和比較。


6.數據類型的選擇

6.1.整數和浮點數
如果不需要小數部分,則使用整數來保存;如果需要表示小數部分,則使用浮點類型。

6.2.浮點數和定點數
浮點數相對於定點數的優勢是:在長度一定的情況下,浮點數能表示更大的數據範圍。但是由於浮點數容易產生誤差,一次對於精確度要求比較高是時,建議使用DECIMAL來存儲,DECIMAL在MYSQL中是以字符串存儲的用於定義貨幣等精確度要求教高的數據。在數據遷移中,float(M,D)是非標準SQL定義,數據庫遷移可能會出現問題,最好不要這樣使用。另外兩個浮點數進行減法和比較運算時也容易出問題,如果進行數值比較,最好用DECIMAL類型。

6.3.日期和時間類型
只需記錄年份,使用YEAR;只記錄時間,用TIME;
同時需要記錄日期和時間,則可以使用TIMESTAMP或者DATETIME.存儲範圍較大的日期使用DATETIME

6.4.CHAR 與 VARCHAR
區別:
a.CHAR是固定長度字符,VARCHAR是可變長度字符;
b.CHAR會自動刪除插入數據的尾部空格,VARCHAR不會刪除尾部空格。
c.CHAR是固定長度,所以它的處理速度比VARCHAR的速度要快,但是它的缺點就是浪費存儲空間。所以對存儲不大,但在速度上有要求的可以使用CHAR類型,反之,使用VARCHAR
存儲引擎對於選擇CHAR和VARCHAR的影響:
a.MyISAM:最好使用固定長度的數據列代替可變長度的數據列。這樣可以使整個表靜態化,從而使數據檢索更快,用空間換時間。
b.InnoDB:使用可變長度的數據列,因爲InnoDB數據表的存儲格式不分固定長度和可變長度,因此使用CHAR不一定比使用VARCHAR更好,但由於VARCHAR是按照實際的長度存儲,比較節省空間,所以對磁盤I/O和數據存儲總量比較好。

6.5.ENUM與SET
a.ENUM只能取單值,它的數據列表是一個枚舉集合。像性別就適合ENUM類型,只能取‘男’或‘女’ 一個值
b.SET可取多值。空字符串也是一個合法的SET值,在去多個值的時候,適合SET類型,比如興趣愛好。

6.6.BLOB與TEXT
a.BLOB是二進制字符串,主要用於圖片、音頻信息等。
b.TEXT是非二進制字符串,用於存儲純文本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章