mysql8數據類型詳解

設計mysql表結構的時候,有很多數據類型供我們選擇,下面來介紹下mysql8中常用的數據類型。

整數類型

類型 大小 有符號範圍 無符號範圍
TINYINT 1 字節 -128 to 127 0 to 255
SMALLINT 2 字節 -32768 to 32767 0 to 65535
MEDIUMINT 3 字節 -8388608 to 8388607 0 to 16777215
INT 4 字節 -2147483648 to 2147483647 0 to 4294967295
BIGINT 8 字節 -9223372036854775808 to 9223372036854775807 0 to 18446744073709551615

整數類型有可選的unsigned屬性,表示不允許負值,這可以使正數的上限提高一倍(還多1)。有符號和無符號類型使用相同的存儲空間,並且具有相同的性能,因此可以根據實際情況選擇合適的類型。

mysql可以爲整數類型指定寬度,例如INT(11),對大多數應用來說這是沒有意義的:它不會限制合法範圍,只是規定了mysql的一些交互工具(例如mysql命令行客戶端)用來顯示字符的個數。對於存儲和計算來說,INT(1)和INT(20)是相同的。

實數類型

類型 大小 有符號範圍 無符號範圍
FLOAT 4字節 -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38 0, and 1.175494351E-38 to 3.402823466E+38
DOUBLE 8字節 -1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308
DECIMAL 根據M和D的值 根據M和D的值

注意FLOAT和DOUBLE可表示的範圍不是完全連續的浮點數,由於精度的限制,有些極小的小數是表示不了的,浮點相關的內容可以參考我的另一篇文章神奇的二進制(二)浮點數

DECIMAL類型最多允許65個數字,表示爲DECIMAL(M,D)的格式。例如DECIMAL(5,2)表示最多保存5個數字,其中2個是小數,表示的範圍在-999.99 到 999.99之間。如果小數位數D爲0,則DECIMAL值不包含小數點或小數部分。

FLOAT和DOUBLE類型只能使用標準的浮點運算進行近似運算,如果需要精確運算,例如金額計算,則需要使用DECIMAL類型。

因爲cpu不支持對DECIMAL的直接計算,所以在mysql5.0以上的版本中,mysql服務器自身實現了DECIMAL的高精度計算。相對而言,cpu直接支持原生的浮點計算,所以浮點計算明顯更快。

涉及到金額計算,在數據量比較大的時候,可以考慮用BIGINT代替DECIMAL。例如金額單位精確到分,99.99可以用9999表示,以分爲單位存儲在BIGINT字段裏,這樣可以同時避免浮點數計算的不精確和DECIMAL精確計算代價高的問題。

字符串類型

類型 大小 用途
CHAR 0-255 字節 定長字符串
VARCHAR 0-65535 字節 變長字符串
BINARY 0-255 字節 定長二進制
VARBINARY 0-65535 字節 變長二進制
TINYBLOB 0-255 字節 變長二進制
BLOB 0-65535 字節 變長二進制
MEDIUMBLOB 0-16,777,215 字節 變長二進制
LONGBLOB 0-4,294,967,295 or 4GB (232 − 1) 字節 變長二進制
TINYTEXT 0-255 字節 變長字符串
TEXT 0-65535 字節 變長字符串
MEDIUMTEXT 0-16,777,215 字節 變長字符串
LONGTEXT 0-4,294,967,295 or 4GB (232 − 1) 字節 變長字符串
CHAR

CHAR類型是定長的,會根據定義的長度分配空間。當存儲CHAR值時,mysql會刪除所有的末尾空格。
在這裏插入圖片描述
CHAR很適合存儲很短的字符串,或者所有的值都接近同一個長度,例如,CHAR非常適合存儲密碼的MD5的值,因爲這是一個定長的長度。對於經常變動的數據,CHAR也比VARCHAR更好,因爲定長的CHAR類型不容易產生碎片。

對於非常短的列,CHAR比VARCHAR在存儲空間上也更有優勢,例如用CHAR(1)來存儲只有Y和N的值,如果採用單字節字符集只需1個字節,但是VARCHAR(1)卻需要2個字節,因爲還需要一個記錄長度的額外字節。

VARCHAR

VARCHAR用於存儲可變長的字符串,它比定長類型更節省空間。VARCHAR需要使用1或2個額外字節記錄字符串的長度:如果列的最大長度小於或等於255字節,則只使用1個字節表示,如果列長度大於255字節,則需要使用2個字節表示長度。

假設採用latin字符集,一個VARCHAR(10)的列需要11個字節空間存儲,一個VARCHAR(1000)的列則需要1002個字節空間存儲,因爲需要存儲2個字節的長度信息。

哪些情況使用VARCHAR類型比較合適呢?

  • 字符串的列長度比平均長度大很多
  • 列的更新很少,碎片不是問題
  • 使用了想UTF-8這樣複雜的字符集,每個字符都使用了不同的字節數進行存儲
BINARY和VARBINARY

BINARY和VARBINARY它們存儲的是二進制字符串。二進制字符串和常規的字符串非常相似,但是二進制字符串存儲的字節碼而不是字符。填充也不一樣:mysql填充BINARY採用的是 \0(零字節)而不是空格,在檢索時也不會去掉填充值。

當需要存儲二進制數據時,可以使用 BINARY或VARBINARY,mysql比較二進制字符串時,每次按一個字節,並且根據該字節的數值進行比較。因此二進制比較比字符串比較簡單的多,所以也更快。

BLOB和TEXT

BLOB和TEXT都是爲了存儲很大數據而設計的字符串數據類型,分別採用二進制和字符方式存儲。

二進制類型:TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB

字符類型:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT

與其他類型不同,mysql把每個BLOB和TEXT值當做一個獨立的對象處理。存儲引擎在存儲是通常會做特殊處理,當BLOB和TEXT值太大時,InnoDB會使用專門的“外部”存儲區域來進行存儲,此時每個值在行內需要1~4個字節存儲一個指針,然後在外部存儲區域存儲實際值。

BLOB和TEXT家族之間僅有的不同是,BLOB存儲的是二進制數據,沒有排序規則和字符集;而TEXT存儲的是字符,有排序規則和字符集。

mysql對BLOB和TEXT列進行排序和其他數據類型不同:它只對每個列的前max_sort_length字節而不是整個字符串做排序。如果只需要排序前面的一小部分字符,則可以減少max_sort_length的值,或者使用ORDER BY SUBSTRING(column,length)。

mysql不能將BLOB和TEXT列全部長度的字符串進行索引,也不能使用這些索引消除排序。

日期和時間類型

類型 大小 範圍 格式 用途
DATE 3 字節 ‘1000-01-01’ to ‘9999-12-31’ YYYY-MM-DD 日期值
TIME 3 字節 ‘-838:59:59’ to ‘838:59:59’ hh:mm:ss 時間值
YEAR 1 字節 1901 to 2155 YYYY 年份值
DATETIME 8 字節 ‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’ YYYY-MM-DD hh:mm:ss 日期和時間值
TIMESTAMP 4 字節 ‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC YYYY-MM-DD hh:mm:ss 日期和時間值

DATETIME使用8個字節的存儲空間,和時區無關。
TIMESTAMP使用4個字節的存儲空間,顯示的時間依賴時區,保存了從1970年1月1號午夜(格林尼治標準時間)以來的秒數,它和unix的時間戳相同。TIMESTAMP只能表示從1970年到2038年。

如果插入和更新數據時沒有指定TIMESTAMP的值,mysql會默認的更新TIMESTAMP的值當前系統時間。

位數類型

類型 範圍
BIT 1 to 64 位

BIT(1)定義一個包含1個位的數據,BIT(2)包含2個位,以此類推,最大長度爲64個位。

mysql把BIT當做字符串類型,而不是數字類型。當檢索BIT的值時,結果是對應二進制表示的ASCII碼轉換後的字符,然而在數字上下文場景中檢索的時候,會使用二進制表示的數字。

例如,如果存儲一個值b’00111001’(十進制的值爲57)到BIT(8)的列並檢索它時,得到的結果是9(9的ASCII碼是57),如果對該字段進行加減,則返回結果57。
在這裏插入圖片描述

JSON類型

mysql8支持直接存儲json格式字符串,對應的是json數據類型。

  • json數據列會自動驗證json的數據格式,如果格式不正確會報錯。
  • 最優化存儲格式。json數據類型會把json格式的字符串轉換成內部格式,能夠快速的讀取其中的元素。

在這裏插入圖片描述對應json數據類型的操作方法有JSON_SET(), JSON_REPLACE(), JSON_REMOVE() 等,詳情請見官方文檔https://dev.mysql.com/doc/refman/8.0/en/json.html。

小結

mysql設計表的數據類型的時候,下面幾個簡單的原則有助於設計出好的數據類型:

  • 更小的更好
    選擇你認爲不會超越範圍的最小類型,更小的數據類型通常更快,因爲它們佔用更少的磁盤、內存和cpu緩存,並且處理時需要的cpu週期更少。
  • 簡單就好
    簡單的數據類型操作通常更快,例如整形的操作比字符串更快,因爲字符串有字符集和校對規則(排序規則)比整形更復雜。
  • 儘量避免null
    如果字段可以不存儲null值,儘量把字段設置成not null。因爲可爲null的列使得索引、索引統計和值比較都更復雜,可爲null的列會使用更多的存儲空間,在mysql裏也需要特殊處理。

參考資料:
《高性能MYSQL(第三版)》
mysql官方文檔






在這裏插入圖片描述

發佈了14 篇原創文章 · 獲贊 170 · 訪問量 8330
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章