MySQL中的奇特之處 資料型別

2021-06-29 06:08:17 字數 2051 閱讀 5475

初用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是不接受的。

MYSQL中的資料型別

mysql支援大量的列型別,它可以被分為3類 數字型別 日期和時間型別以及字串 字元 型別。本節首先給出可用型別的乙個概述,並且總結每個 列型別的儲存需求,然後提供每個類中的型別性質的更詳細的描述。概述有意簡化,更詳細的說明應該考慮到有關特定列型別的附加資訊,例如你能為其指定值的允 許格式。由mys...

mysql 中的資料型別

mysql 中的資料型別 2008 01 29 13 23 資料型別 描述位元組 推薦使用 smallint 整數,從 32000到 32000範圍 2儲存相對比較小的整數。比如 年紀,數量 int整數,從 2000000000 到 2000000000 範圍 4儲存中等整數 例如 距離 bigin...

MySQL中的資料型別

資料型別 描述 位元組 推薦使用 allint 整數,從 32000到 32000範圍 2 儲存相對比較小的整數。比如 年紀,數量 int 整數,從 2000000000 到 2000000000 範圍 4 儲存中等整數 例如 距離 bigint 不能用 allint 或 int描述的超大整數。8 ...