MySQL的數據類型包括整數類型、浮點數類型、定點數類型、日期和時間類型、字符串類型和二進制數據類型。不同數據類型決定了數據的存儲格式、有效范圍和相應的限制。
MySQL支持的整數類型如下表所示
MySQL支持數據類型的名稱後面指定該類型的顯示寬度,基本形式如下:
數據類型(顯示寬度)
顯示寬度指能夠顯示的最大數據的長度。在不指定寬度的情況下,整數類型的默認顯示寬度與其有符號數的最大值的顯示寬度相同。如INT型為11,BIGINT型為20。
但實際上,即使出入的數據的寬度大於了設置的顯示寬度,但只要小於等於默認寬度,就可以正常完整的顯示出來。
浮點數類型和定點數類型用來表示小數。包括以下類型
其中,定點數類型的M指精度,是數據的總長度。小數點並不占位置,D為標度,指小數點後的長度。當插入數據的精度高於實際定義的精度時,系統會自動進行四捨五入處理。浮點數類型FLOAT和DOUBLE在四捨五入時不會報錯,但定點數類型DECIMAL會有警告。
當未指定精度時,DECIMAL型會默認整數位為10,小數位為0,即默認為整數。
由於定點數在MySQL中是以字符串形式存儲的,其精度比浮點數高,而且浮點數會出現誤差,在對數據精度要求高的情況下,選擇DECIMAL比較安全。
當插入的數據值超過了該類型的取值范圍時,系統會報錯,並將相應的零值插入到數據庫中。
向Year類型插入數據時可以直接用數字也可以用字符串,對於低於4位的會自動轉換,如輸入32,‘78’,3,‘2’會分別轉換為2032,1978,2003和2002。
注意‘0’和‘00’都會轉換為2000,而0會轉化為0000。
Time類型的數據賦值方式如下
‘D HH:MM:SS’格式的字符串,或者’HHMMSS’格式的字符串或者HHMMSS格式的數值,其中D表示天數,取值范圍為0~34,保存時會自動將D轉換到HH處,如輸入‘2 11:32:21’會轉換為’59:32:21’,當然輸入不必嚴格遵守上述格式,系統會自動轉換,具體規則可以自己嘗試。如’2 20’,’2 20:20’,’30’和’345454’會轉換為’68:00:00’,’68:20:00’,’00:00:30’和’34:54:54’。即基本符合從左向右分配。
當HH和SS的賦值大於60時,即此值無效,系統會報錯,並將其轉換為00:00:00。在輸入數據合法但超出Time值范圍時,會被裁為范圍內最接近的端點,如’880:00:00’會轉換為’838:59:59’。
可以適用CURRENT_TIME和NOW()出入當前系統時間。
可以適用’YYYY-MM-DD’或’YYYYMMDD’格式的字符串、’YY-MM-DD’或’YYMMDD’格式的字符串、YYYYMMDD或YYMMDD格式的數字表示。
同樣可以使用CURRENT_DATE或者NOW()來輸入當前系統日期。
DATATIME類型相當於DATE類型和TIME類型的組合。
當某字段的數據類型為DATETIME時,使用NOW()可以輸入當前系統日期和時間。
與DATETIME類型相同點:
- 顯示格式相同
- 復制方法相同
- 用NOW()轉為換系統當前時間
與DATETIME類型不同點:
- 比DATETIME類型范圍小
- 使用CURRENT_TIMESTAMP來輸入系統當前日期和時間
- 輸入NULL或無任何輸入時,系統自動輸入系統當前日期和時間
- 該類型能夠根據不同的地區的時區來轉換時間
字符串類型包括CHAR、VARCHAR、BLOB、TEXT、ENUM和SET。
兩者都是在創建表時就指定了最大長度,基本形式如下
字符串類型(M)
注意CHAR類型的長度是固定的,永遠是指定的M,其值可以是0~255的任意值。
而VARCHAR類型的長度是可變的,創建時指定的M只是最大長度,可以取0~65535之間任意值。即在最大值M范圍內使用多少分配多少,實際占用空間為字符串的實際長度加1,此1為字符串的結束標志符。因此會保存輸入字符串最後的空格,而前者不會。
當出入的字符串長度大於可插入最大值時,系統會阻止插入並報錯。
雖然VARCHAR比CHAR占用空間小、更靈活,但處理速度卻比不上CHAR型,所以對於長度變化不大和查詢速度要求較高的字符串類型,最好還是選擇CHAR類型。
TEXT類型只能保存字符數據,具體分類有
ENUM類型又稱為枚舉類型。在創建表時,其取值范圍就以列表的形式制定了。基本形式如下
屬性名 ENUM(‘值1’, ‘值2’, ···,’值n’)
其中,屬性名指字段的名稱,’值n’表示列表中的第n個值,這些值末尾的空格都會被系統直接刪除。
ENUM類型的值只能取列表中的一個元素。取值列表中最多可以有65535個值。列表中的每個值都有一個順序排列的編號,MySQL中存儲的是這個編號而非列表中的具體值。
一般來說,如果只能選取列表中的一個值,就選擇ENUM類型,如果需要選取列表中的多個值的組合,則需要選擇SET類型。
同樣,在創建表時,其取值范圍就以列表的形式制定了。基本形式如下
屬性名 SET(‘值1’, ‘值2’, ···,’值n’)
具體同ENUM類型。
在取多個元素時,不同元素之間用逗號隔開,SET類型的值最多只能是有64個元素構成的集合。同ENUM,存儲的是編號而非具體值。
插入記錄時,SET字段中的元素順序無關緊要,系統會自動按照定義時的順序顯示。
如SET類型的取值類表為(‘A’,’B’,’C’,’D’,’E’),插入值為(‘B’)和(‘C,B,D’)時,結果顯示為(B)和(B,C,D)。
類似於CHAR和VARCHAR類型的關系和使用方法。
對於CHAR來說,不足最大長度的空間用“\0”補全。
BIT類型也是在創建表時指定了最大長度,基本形式為
BIT(M)
如字段的類型為BIT(4),則存儲的數據是從0~15。
在查詢BIT類型的數據時,要用BIN(字段名+0)來將值轉換為二進制顯示。
此為一種特殊的二進制類型,可以用來保存數據量很大的二進制數據,如圖片等。包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
BLOB類型主要用來存儲圖片、PDF文檔等二進制文件。通常來說,可以將這些文件存儲在文件系統中,然後在數據庫中存儲這些文件的路徑,這種方式比直接存儲在數據庫中簡單,當然訪問速度也會慢一些。
在MySQL中創建表時需要考慮為字段選擇哪種數據類型最合適。基本注意事項可以參考上述總結。
下面是一些常見問題