1. 程式人生 > >Mysql學習筆記(5)--mysql的資料型別

Mysql學習筆記(5)--mysql的資料型別

1、float、dounle和decimal三者之間的不同

對於小數的表示,MySQL 分為兩種方式:浮點數和定點數。浮點數包括 float(單精度)和double(雙精度),而定點數則只有decimal一種表示。定點數在MySQL內部以字串形式存放,比浮點數更精確,適合用來表示貨幣等精度高的資料。

浮點數和定點數都可以用型別名稱後加“(M,D)”的方式來進行表示,“(M,D)”表示該值一共顯示M位數字(整數位+小數位),其中D位位於小數點後面,M和D又稱為精度和標度。例如,定義為float(7,4)的一個列可以顯示為-999.9999。MySQL儲存值時進行四捨五入,因此如果在 float(7,4)列內插入 999.00009,近似結果是 999.0001。值得注意的是,浮點數後面跟“(M,D)”的用法是非標準用法,如果要用於資料庫的遷移,則最好不要這麼使用。float和double在不指定精度時,預設會按照實際的精度(由實際的硬體和作業系統決定)來顯示,而decimal在不指定精度時,預設的整數位為10,預設的小數位為0。

下面通過例子來展示三者之間的不同:

(1)建立測試表。分別將id1、id2、id3欄位設定為float(5,2),double(5,2)、decimal(5,2);

 

(2)往id1、id2,id3這三個欄位中插入資料1.23;會發現資料可以正常插入;

 

(3)往id1,id2,id3這三個欄位插入資料1.234,1.234,1.23;我們會發現雖然可以將資料插進去,但是id1,id2會被捨去最後一位;

 

(4)同時向id1,d2,id3插入資料1.234;id3資料被截斷,且系統會出現warning

 

(5)將三個欄位的精度和標度曲表,在此插入1.23:

 

(6)總結:上面這個例子驗證了上面提到的浮點數如果不寫精度和標度,則會按照實際精度值顯示,如果有精度和標度,則會自動將四捨五入後的結果插入,系統不會報錯;定點數如果不寫精度和標度,則按照預設值decimal(10,0)來進行操作,並且如果資料超越了精度和標度值,系統則會報錯;

 

2、日期時間型別

 

(1)如果要用來表示年月日,通常用DATE 來表示;

如果要用來表示年月日時分秒,通常用DATETIME表示;

如果只是表示時分秒,通常用TIME來表示;

如果需要經常插入或者更新日期為當前系統時間,則通常使用TIMESTAMP來表示。TIMESTAMP值返回後顯示未"YYYY-MM-DD HH:MM:SS"格式的字串,顯示寬度固定位19個字元。如果需要獲得數字值的話,應該在TIMESTAMP列新增“0”;

如果只是表示年份的話,我們可以使用YEAR,它比DARE佔用更少的空間。

(2)例子:

建立一個表t,欄位分別為date,time,datetime三種日期類別;然後用now()插入當前日期;

3、字串型別

(1)char 和varchar型別

CHAR和VARCHAR很類似,都用來儲存MySQL中較短的字串。二者的主要區別在於儲存方式的不同:CHAR列的長度固定為建立表時宣告的長度,長度可以為從0~255的任何值;而VARCHAR列中的值為可變長字串,長度可以指定為0~255(MySQL 5.0.3版本以前)或者 65535(MySQL 5.0.3版本以後)之間的值。在檢索的時候,CHAR列刪除了尾部的空格,而VARCHAR則保留這些空格。

例子:①建立測試表vc,並定義兩個欄位“v VARCHAR(4)”和“c CHAR(4)”;

②向v和c列中同時插入字串“ab”

③顯示查詢結果

 

討論:但是實際上,我敲出來的char的長度卻不是建立表時的長度。

 

(2)BINARY和VARBINARY型別

BINARY和VARBINARY類似於CHAR和VARCHAR,不同的是它們包含二進位制字串而不包含非二進位制字串。在下面的例子中,對錶t中的binary欄位c插入一個字元,研究一下這個字元到底是怎麼樣儲存的。

①建立測試表t3,欄位為c BINARY(3):

 

(3) ENUM型別

ENUM中文名稱叫列舉型別,它的值範圍需要在建立表時通過列舉方式顯式指定,對1~255個成員的列舉需要1個位元組儲存;對於255~65535個成員,需要2個位元組儲存。最多允許有65535個成員。

建立測試表t4,定義gender欄位為列舉型別,成員為“M"和”F“,並且插入4條不同的記錄

 

總結:ENUM型別是忽略大小寫的,在儲存“M”、“f”時將它們都轉成了大寫,還可以看出對於插入不在 ENUM 指定範圍內的值時,並沒有返回警告,而是插入了enum('M','F')的第一個值“M”,這點使用者在使用時要特別注意。

另外,ENUM型別只允許從值集合中選取單個值,而不能一次取多個值。

 

4、SET型別

SET和ENUM型別非常類似,也是一個字串物件,裡面可以包含0~64個成員。根據成員的不同,儲存上也有所不同。

1~8成員的集合,佔1個位元組。

9~16成員的集合,佔2個位元組。

17~24成員的集合,佔3個位元組。

25~32成員的集合,佔4個位元組。

33~64成員的集合,佔8個位元組。

SET 和 ENUM 除了儲存之外,最主要的區別在於 SET 型別一次可以選取多個成員,而ENUM則只能選一個。

例如:在表t5中插入多組不同的成員

 

總結:

SET型別可以從允許值集合中選擇任意1個或多個元素進行組合,所以對於輸入的值只要是在允許值的組合範圍內,都可以正確地注入到SET型別的列中。對於超出允許值範圍的值例如('a,d,f ')將不允許注入到上面例子中設定的SET型別列中,而對於('a,d,a')這樣包含重複成員的集合將只取一次,寫入後的結果為“a,d”,這一點請注意