MySQL中的奇特之處:數據類型

初用MySQL,發現一些和Oracle等數據庫不一樣的地方,寫下來方便查閱參考。

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"屬性。


另外需注意,只有timestamp或者datetime類型可以被初始化爲非常數值。如果想將一個date列初始化爲current_date,mysql是不接受的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章