Mysql服務端(一) 資料型別選擇

2021-08-20 14:23:19 字數 3014 閱讀 6810

要了解 mysql 資料庫,首先必須要了解 mysql 支援的資料型別。實際上,mysql 支援很多資料型別,包括整數型別、實數型別、字串型別、列舉型別、時間型別等。對於整數型別,可以使用 tinyint、 smallint、 mediumint、 int、 bigint 等。每個整數型別都對應著不同的儲存空間。

資料型別

儲存(bytes)

tinyint

1smallint

2mediumint

3int

4bigint

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 等。每個實數型別都對應著不同的儲存空間。

資料型別

儲存(bytes)

float

4double

8float(m,d) 和 double(m,d) 表示一共顯示 m 位整數,d 位小數。舉個例子,float(5,2) 可以顯示為 100.99。此外,讀者還要注意的是,mysql 儲存時會進行四捨五入,因此,如果值為 100.0099, 會儲存近似結果 100.01。

float 只保證 6 位有效數字的準確性,所以 float(m,d) 中,m<=6 時,數字通常是準確的。

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,因為它的空間利用率更高。

mysql學習 一 資料型別

數字型別 整型 tinyint 最小整數,有符號的範圍 127 127,無符號的範圍 0 255,乙個位元組 bool 最小整數,有符號的範圍 127 127,無符號的範圍 0 255,乙個位元組 smallint 小型整數,有符號的範圍 32768 32767,無符號的範圍 0 65536,兩個位...

Mysql筆記(一)資料型別

1 整形型別 型別名稱 儲存需求 tinyint 1個位元組 smallint 2個位元組 mediumint 3個位元組 int integer 4個位元組 bigint 8個位元組 create table tbint 11 中的11表示的是該資料型別制定的顯示寬度,制定能夠現實的數值中數字的個...

一 資料型別

資料超出最大值後得到最小值,超出最小值後得到最大值,本質上是位元組數的限制。char 1位元組,short 2位元組,int 4位元組,unsigned int 4位元組,long 4位元組,long long 8位元組,float 4位元組,double 8位元組 無符號資料範圍 0至2 位元組數...