1. 整數數據類型
表達範圍從小到大依次爲tinyint,smallint,mediumint,int,bigint,佔用的存儲字節數分別爲1,2,3,4,8。
類型後面可以在括號中標註顯示寬度,例如int(5),其中5就是顯示寬度,表示該數據在顯示時應該使用5個十進制數字。
顯示寬度只適用於應用程序。它的取值不影響DBMS如何存儲數據,也不限制什麼取值範圍的數據可以被存儲。在查詢時,它和數據一起被從DBMS返回給應用程序,由應用程序決定如何使用它。
mysql中沒有原生的bool類型。當在DDL中使用boolean類型時,實際上會被解釋爲tinyint(1)。
所以在mysql中,如果想表示只有兩個取值的bool類型,使用boolean或者tinyint(1)即可。如果想表示10以內的小整數,不要使用tinyint(1)類型,因爲可能會被解釋爲boolean類型。替代方法是使用tinyint(2)或其它整數類型。
2. 時間戳類型
mysql中有兩個類型可以表達時間戳:timestamp,datetime。兩者的數值表達能力是一樣的,都可以表達年月日時分秒微秒,即下面的格式:
'YYYY-MM-DD HH:MM:SS[.fraction]'
注:在5.6.4版本之前,是不存儲微秒部分的。
它們的主要區別是:
1)表達範圍不同
datetime的表達範圍是:'1000-01-01 00:00:00.000000' - '9999-12-31 23:59:59.999999'
timestamp的表達範圍是:'1970-01-01 00:00:01.000000' - '2038-01-19 03:14:07.999999'
2)存儲方式不同
datetime的存儲數據中不包含時區信息。datetime的各部分分別存儲,所以需要空間比較大。在5.6.4版本之前,佔用8個字節。從5.6.4版本起,會佔用5個字節再額外加微秒部分。猜測5個字節的分配爲:
年份:14個bit
月份:4個bit
日期:5個bit
時:5個bit
分:6個bit
秒:6個比特
合計40個bit,剛好是5個字節。
timestamp的存儲數據隱含了時區信息(是UTC時區)。非UTC時區的時間戳在存儲時會被轉換爲UTC時區的時間,而在查詢時則被轉換爲查詢會話的時區。不同時區的客戶端查詢同一個timestamp得到的結果可能看起來不同。
timestamp的存儲數據是一個32bit的整數,佔用4個字節,表示自1970-1-1 00:00:00以來的秒數。在5.6.4版本之前,只是這4個字節。 從5.6.4版本起 ,再額外加微秒部分。
3)空值
與其它數據類型不同,timestamp類型缺省爲非空。如果賦予null值,會自動轉化爲current_timestamp。
datetime類型缺省則爲可空(和其它數據類型一樣)。
4)初始化方式不同(這裏的討論僅限初始化爲當前時間戳)
MySQL中有兩種時間戳初始化方式:
DEFAULT current_timestamp:表示在行創建時爲該時間戳列自動賦值
ON UPDATE current_timestamp:表示在行中其它列發送改變時爲該時間戳列自動賦值
在5.6.5版本之前,只有timestamp類型的時間戳可以被自動初始化數值,而且至多隻能給一列timestamp指定自動初始化。可以給同一個timestamp列同時指定兩種初始化,但不能給不同的timestamp列分別指定不同的初始化方式。而datetime類型則根本不能被自動初始化。
從5.6.5版本起,timestamp和datatime都可以被自動初始化。如果第一個timestamp列類型爲非空並且沒有指定任何自動初始化屬性(類似於 "c1 timestamp,"這樣的最簡潔的寫法),那麼該列會缺省具有"default current_timestamp on update current_timestamp"屬性。