MySQL基本操作整理(七)、MySQL數據類型

今天整理MySQL中的數據類型,這對理解每個數據庫表的設計是非常有幫助的。對於該部分,主要以瞭解爲主,不要求熟練記住每種數據類型對應的取值範圍等,在實際的開發過程中,會應用就可以了。

MySQL中的數據類型按照大類分,主要分爲三類:數值型、字符型和日期型。下面分別介紹每種數據類型。

一、數值型

數值型分爲整數類型小數類型,小數類型又可分爲定點數浮點數,其中定點數的精度更高。

1. 整型

MySQL中的整型分爲Tinyint, Smallint, Mediumint, Int/Integer, Bigint,分別佔據1,2,3,4,8個字節。默認是有符號的,符號位佔一位,負數用補碼錶示。
在這裏插入圖片描述
以Tinyint爲例
無符號位,很好計算,最小值0,最大值直接2^8-1=255;
有符號數,符號位佔1位,剩餘7位,
正數:因此正數能表示的最大值爲2^7-1=127;
負數:負數用補碼錶示,如要計算-128的補碼,先計算絕對值的原碼,然後全部取反再加一
-128 —>128的原碼:1000 0000 —>全部取反:0111 1111 —>加1: 1000 0000 (Tinyint的最小負數)
  -1 —> 1的原碼: 0000 0001 —>全部取反:1111 1110 —>加1: 1111 1111 (Tinyint的最大負數)

整型的特點:
① 如果不設置無符號還是有符號,默認是有符號,如果想設置無符號,需要添加unsigned關鍵字
② 如果插入的數值超出了整型的範圍,會報out of range異常,並且插入臨界值(如果自己配置過mysql的設置,這裏不會報警告的異常,會直接報錯,不能插入)
③ 如果不設置長度,會有默認的長度。長度代表了顯示的最大寬度,如果不夠會用0在左邊填充,但必須搭配zerofill使用,並且只支持正數(所以unsigned加不加便無意義)

案例1:設置整型的無符號和有符號

CREATE TABLE tab_int(
	t1 INT,
	t2 INT UNSIGNED 
);
INSERT INTO tab_int VALUES(-123456, 123456); #正常插入
INSERT INTO tab_int VALUES(-123456,-123456); #第二個參數超範圍,實際插入(-123456,0)
INSERT INTO tab_int VALUES(2147483648,4294967296);#兩個數都超範圍,實際插入(2147483647,4294967295)

案例2:設置整型的長度(也可以說是寬度)

CREATE TABLE tab_int(
	t1 INT(7),
	t2 INT(7) ZEROFILL 
);
INSERT INTO tab_int VALUES(123,123); #實際插入(123, 0000123)

2. 小數

小數分浮點型和定點型,浮點型分float(單精度浮點型)和double(雙精度浮點型),定點型爲decimal。
浮點型和定點型都可以指定精度,用M,D來表示,如float(M,D), double(M,D),dec(M,D)或者decimal(M,D)
在這裏插入圖片描述
單精度和雙精度:
在這裏插入圖片描述
小數的特點:
①M和D的含義:
M:精度,整數部位+小數部位
D:標度,小數部位
如果超過範圍,則插入臨界值
②默認值情況:
M和D都可以省略
如果是decimal,則M默認爲10,D默認爲0(表示整數)
如果是float和double,則會根據插入的數值的精度來決定精度(無論什麼數值都可以插入)
定點型的精確度較高,如果要求插入數值的精度較高如貨幣運算等則考慮使用

案例1:測試M和D

CREATE TABLE tab_float(
	f1 FLOAT(5,2),
	f2 DOUBLE(5,2),
	f3 DECIMAL(5,2)
);

INSERT INTO tab_float VALUES(123.45,123.45,123.45); #正常插入
INSERT INTO tab_float VALUES(123.456,123.456,123.456); #超小數範圍,實際插入(123.46, 123.46, 123.46)
INSERT INTO tab_float VALUES(123.4,123.4,123.4);#未達到小數位數,實際插入(123.40,123.40,123.40)
INSERT INTO tab_float VALUES(1523.4,1523.4,1523.4);#超範圍插入臨界值,實際插入(999.99, 999.99, 999.99)

案例2:測試默認情況

CREATE TABLE tab_float(
	f1 FLOAT,
	f2 DOUBLE,
	f3 DECIMAL
);
INSERT INTO tab_float VALUES(123.4523,123.4523,123.4523);#decimal警告

原則:
所選擇的類型越簡單越好,能保存數值的類型越小越好。

二、字符型

我們將串數據都歸結爲字符型,其中的串數據可以是文本型也可以是二進制型。字符型主要分爲較短的文本、較長的文本和其他類型。

分類:

  • 較短的文本:char、varchar 【★】
  • 較長的文本:text、blob(較大的二進制)
  • 其他類型包括:binary、varbinary用於保存較短的二進制,enum保存枚舉型,set保存集合

char和varchar的對比:

類型 寫法 M的意思 M的取值 特點 空間的耗費 效率
char char(M) 最大的字符數,可以省略,默認爲1 0~255 固定長度的字符 比較耗費
varchar varchar(M) 最大的字符數,不可以省略 0~65535 可變長度的字符 比較節省

多說一句:char(M)無論插入的字符個數有沒有達到M,開闢的空間都是M大小,而varchar(M)能根據實際插入的字符個數開闢空間。

案例1:測試enum

CREATE TABLE tab_char(
	c1 ENUM('a', 'b', '中國')
);

INSERT INTO tab_char VALUES ('a');
INSERT INTO tab_char VALUES ('中國');
INSERT INTO tab_char VALUES ('A'); #插入成功,插入'a'
INSERT INTO tab_char VALUES ('m'); #插入失敗

案例2:測試set

CREATE TABLE tab_set(
	s1 SET('a','b','c','d')
);
INSERT INTO tab_set VALUES('a');
INSERT INTO tab_set VALUES('A,B'); #插入成功,插入'a,b'
INSERT INTO tab_set VALUES('a,c,d');

三、日期型

日期型主要分爲五種類型:date、datetime、timestamp、time和year。其中需要重點區分的是datetime和 timestamp。
在這裏插入圖片描述
datetime和timestamp的區別:

  1. Timestamp支持的時間範圍較小,取值範圍:19700101080001–2038年的某個時間
    Datetime的取值範圍:1000-01-01–9999-12-31
  2. timestamp和實際時區有關,更能反映實際的日期,而datetime則只能反映出插入時的當地時區
  3. timestamp的屬性受mysql版本和SQLMode的影響很大

案例:測試 datetime 和 timestamp

CREATE TABLE tab_date(
	t1 DATETIME,
	t2 TIMESTAMP
);

INSERT INTO tab_date VALUES(NOW(),NOW());
SELECT * FROM tab_date;

查詢結果:
在這裏插入圖片描述
修改時區再次測試:

SHOW VARIABLES LIKE 'time_zone';
SET time_zone='+9:00';
SELECT * FROM tab_date;

查詢結果:
在這裏插入圖片描述
datetime和timestamp大PK

類型 字節 範圍 時區等的影響
datetime 8 1000-9999 不受
timestamp 4 1970-2038
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章