服務端指南 數據存儲篇 | MySQL(01) 數據類型的使用與選擇

要了解 MySQL 數據庫,首先必需要了解 MySQL 支持的數據類型。實際上,MySQL 支持不少數據類型,包括整數類型、實數類型、字符串類型、枚舉類型、時間類型等。mysql

原文地址:服務端指南 數據存儲篇 | MySQL(01) 數據類型的使用與選擇
博客地址:blog.720ui.com/sql

整數類型

對於整數類型,可使用 TINYINT、 SMALLINT、 MEDIUMINT、 INT、 BIGINT 等。每一個整數類型都對應着不一樣的存儲空間。數據庫

數據類型 存儲(Bytes)
TINYINT 1
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT 8

當使用整數類型時,存在一些使用細節,這裏,給讀者進行說明。數組

整數類型能夠選擇 UNSIGNED 屬性,表示不容許負數,這樣可使得正數的上限提升一倍。舉個例子,INT 的存儲範圍是 -2-31 ~ 231 - 1,也就是 -2147483648 ~ 2147483647,那麼 UNSIGNED INT 能夠存儲的範圍就是 0 ~ 263 - 1,即 0 ~ 9223372036854775807。微信

整數類型能夠指定寬度,然而對大多數場景是沒有意義的,它並不會限制整數類型的合法範圍,它只是規定某些交互工具顯示出來的字符個數。若是不顯示地指定寬度,則默認爲 INT(11)。有讀者會誤認爲 INT(11) 指定整數類型的長度是 11 位,這個想法是錯誤的。實際上,在 Zerofill 屬性中,表示當數組寬度小於 11 位時,在數字前面加 0 填滿寬度。工具

更小的數據類型一般更快,由於佔用更少的磁盤空間。舉個例子,若是須要存儲性別狀態(1-男;2-女;99-未知),這個時候應該優先考慮 TINYINT,而不是 INT,由於 TINYINT 佔用更少的磁盤空間。所以,須要選擇合適的整數類型來減小佔用的磁盤空間,而不是選擇所有使用 INT 或 BIGINT。大數據

實數類型

對於實數類型,可使用 FLOAT、 DOUBLE、 DECIMAL 等。每一個實數類型都對應着不一樣的存儲空間。ui

數據類型 存儲(Bytes)
FLOAT 4
DOUBLE 8

FLOAT(M,D) 和 DOUBLE(M,D) 表示一共顯示 M 位整數,D 位小數。舉個例子,FLOAT(5,2) 能夠顯示爲 100.99。此外,讀者還要注意的是,MySQL 保存時會進行四捨五入,所以,若是值爲 100.0099, 會保存近似結果 100.01。cdn

FLOAT 只保證 6 位有效數字的準確性,因此 FLOAT(M,D) 中,M<=6 時,數字一般是準確的。blog

DOUBLE 只保證 16 位有效數字的準確性,因此 DOUBLE(M,D) 中,M<=16 時,數字一般是準確的。

在使用實數類型,要重點考慮精度問題。DOUBLE 是 MySQL 內部浮點計算的類型,它比 FLOAT 有更高的精度和更大的範圍,可是 FLOAT 和 DOUBLE 都是不精確的,若是要實現精確浮點運算,就須要使用 DECIMAL 類型。

所以,若是須要考慮精度問題,優先考慮 DECIMAL 類型。若是對精度問題不是特別敏感,能夠考慮使用 FLOAT 或者 DOUBLE 類型。

字符串類型

對於實數類型,可使用 CHAR、 VARCHAR、 BLOB、 TEXT 等。

CHAR 類型是定長的。MySQL 會根據定義的長度分配空間。CHAR 長度能夠是 0 到 255之間的值。

VARCHAR 類型用於存儲可變長字符串,它更加節省空間。值得注意的是, VARCHAR 實際上會使用 1 或 2 個額外字節記錄字符串的長度。VARCHAR 長度能夠指定 0 到 65535 之間的值。

BLOB 和 TEXT 主要用來存儲大文本,分別採用二進制和字符串方式存儲。若是 BLOB 和 TEXT 還沒法知足需求,還可使用 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT。值得注意的是,它們不可以有默認值。

對於字符串類型的使用場景,能夠大概總結下。

定長的字符串,能夠選擇 CHAR。舉個例子,身份證是定長類型,那麼選擇 CHAR 是很是合適的。

變長的字符串,能夠選擇 VARCHAR, 由於 VARCHAR 更加節省空間。

存儲大文本的場景,能夠考慮使用 BLOB 和 TEXT。若是 BLOB 和 TEXT 還沒法知足需求,還可使用 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT。

枚舉類型

實際上, 枚舉類型保存的是整數類型,但其顯示爲字符串。若是將一個非法值插入,即容許的值以外的字符串,枚舉類型將不容許操做,可是枚舉類型容許空字符串和 NULL 類型。

儘可能不要使用枚舉類型,由於枚舉類型增長了維護成本。試想,若是須要增長新的枚舉類型,須要全表更新,若是對於大數據量的更新場景,會形成鎖表,這是多麼恐怖的事情。

時間類型

對於時間類型,MySQL 提供了豐富的數據類型: YEAR、 DATE、 TIME、 DATETIME、 TIMESTAMP。每一個時間類型都對應着不一樣的時間格式。

數據類型 時間格式 案例
YEAR 0000 2017
DATE 0000-00-00 2017-01-01
TIME 00:00:00 01:01:01
DATETIME 0000-00-00 00:00:00 2017-01-01 01:01:01
TIMESTAMP 0000-00-00 00:00:00 2017-01-01 01:01:01

MySQL 可以存儲的最小單位是秒,若是須要更精確的存儲,就必須本身定義存儲格式。

MySQL 時間類型是存在範圍的。

數據類型 範圍
DATE '1000-01-01' ~ '9999-12-31'
DATETIME '000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
TIMESTAMP '1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07' UTC

DATETIME 和 TIMESTAMP 均可以存儲相同類型的數據,而 TIMESTAMP 只使用 DATETIME 一半的存儲空間。一般狀況下,建議優先考慮 TIMESTAMP,由於它的空間利用率更高。

(完)

更多精彩文章,盡在「服務端思惟」微信公衆號!

相關文章
相關標籤/搜索