MySQL的常見數據類型

我們在進行數據庫的設計中設計表的時候需要考慮選擇合適的數據類型, 比如年齡,需要的是無符號的,那麼 tinyint 就足夠了,不必須非得要int型的, 這樣可以節省數據空間,也是一種優化。
整型:
類型: 字節: 有符號 無符號
tinyint: 1個字節 -128 —127 0 –255
smallInt: 2個字節 -32768 — 32767 0 —65535
mediumint 3個字節 0 —- 2 (24) -1
int 4個字節
bigint 8個字節

浮點型小數:
float[(M, D)] 單精度小數, 一般最高精確到保留小數點到7位, M是數字總位數, D是小數點後面的位數
double[(M, D)] 雙精度小數,一般最高精確到保留小數點到14位,

定點型小數
decimal 和numeric 類型在MySQL中視爲相同的類型。它們用於保存必須爲確切精度的值。
DECIMAL(M,D),其中M表示十進制數字總的個數,D表示小數點後面數字的位數,假如取值範圍爲-999.99~999.99。
如果存儲時,整數部分超出了範圍(如上面的例子中,添加數值爲1000.01),MySql就會報錯,不允許存這樣的值。
如果存儲時,小數點部分若超出範圍,就分以下情況:
若四捨五入後,整數部分沒有超出範圍,則只警告,但能成功操作並四捨五入刪除多餘的小數位後保存。如999.994實際被保存爲999.99。
若四捨五入後,整數部分超出範圍,則MySql報錯,並拒絕處理。如999.995和-999.995都會報錯。
M的默認取值爲10,D默認取值爲0。如果創建表時,某字段定義爲decimal類型不帶任何參數,等同於decimal(10,0)。帶一個參數時,D取默認值
M的取值範圍爲1~65,取0時會被設爲默認值,超出範圍會報錯。
D的取值範圍爲0~30,而且必須<=M,超出範圍會報錯。

時間日期型 用的比較少, 一般會採用數字類型來取代它
year 年 1901 - 2155
time
date 年月日 1000年的 1月1號 到9999年的12 月31 號
datetime 年月日時分秒 1000年的 1月1號 0點0分0秒 到9999年的12 月31 號 23點59分59秒
timestamp 時間戳 年月日時分秒 1970年的1月1號 -2037 年

字符型
char(M) 定長字符 M :[0 ,255], 比如定義了 char(5), 實際存儲的時候還是會佔用5個字節長度,即使實際數據就用了3個字節, 少的字節會自動補上空格符號。
varchar(M) 變長字符 M: [0, 65536] 比如定義了 varchar(5), 實際存儲的時候會佔用實際數據使用的字節數, 如果數據就使用了3個字節,則只佔用3個字節的內容, 但是會在最後加上一個空格
tinyText
text // 可以看做是更大的varchar
mediumtext
longtext
enum 1或者2個字節 ,最多65536個值
Set 1,2,3,4,或者8個字節

char 和 varchar的比較,char比varchar更加耗費空間,但是因爲定長,在處理速度上快一點。 如果一個VARCHAR列經常被修改,而且每次被修改的數據的長度不同,這會引起‘行遷移’(Row Migration)現象,而這造成多餘的I/O,是數據庫設計和調整中要盡力避免的,在這種情況下用CHAR 代替 VARCHAR會更好一些。
char適用於 較短的字符固定長度的字符,以及某一列經常被改變字符長度
char 與varchar的實際存儲:
02

mysql 的 innodb 存儲引擎 建意使用varchar 類型這是因爲對於InnoDB表,因爲它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(所有數據行共用一個表頭部分,這個標頭部分存放着指向各有關數據列的指針),所以使用char類型不見得會比使用varchar類型好。事實上,因爲char類型通常要比varchar類型佔用更多的空間,所以從減少空間佔用量和減少磁盤i/o的角度,使用varchar類型反而更有利。

在MySQL中用來判斷是否需要進行對據列類型轉換的規則
  1、在一個數據表裏,如果每一個數據列的長度都是固定的,那麼每一個數據行的長度也將是固定的.
  2、只要數據表裏有一個數據列的長度的可變的,那麼各數據行的長度都是可變的.
  3、如果某個數據表裏的數據行的長度是可變的,那麼,爲了節約存儲空間,MySQL會把這個數據表裏的固定長度類型的數據列轉換爲相應的可變長度類型.
例外:長度小於4個字符的char數據列不會被轉換爲varchar類型

varchar他既然可以自動適應存儲空間,那我varchar(8)和varchar(255)存儲應該都是一樣的,那每次表設計的時候往大的方向去好了,免得以後不夠用麻煩。這個思路對嗎?答案是否定的。mysql會把表信息放到內存中(查詢第一次後,就緩存住了,linux下很明顯,但windows下似乎沒有,不知道爲啥),這時內存的申請是按照固定長度來的,如果varchar很大就會有問題。所以還是應該按需索取。

BINARY和VARBINARY類型(2) 類似於char 與varchar 只不過是存儲的二進制串
bin 存儲二進制
BLOB 和Text 是對應的, 不過存儲的是二進制大對象

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