MySQL基礎(chǔ)教程2 — 數(shù)據(jù)類型之日期和時(shí)間類型

表示時(shí)間值的DATE和時(shí)間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。每個(gè)時(shí)間類型有一個(gè)有效值范圍和一個(gè)“零”值,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用“零”值。TIMESTAMP類型有專有的自動(dòng)更新特性,將在后面描述。

如果試圖插入一個(gè)不合法的日期,mysql將給出警告或錯(cuò)誤??梢允褂胊llow_invalid_dates sql模式讓mysql接受某些日期,例如’1999-11-31’。當(dāng)你想要保存一個(gè)“可能錯(cuò)誤的”用戶已經(jīng)在數(shù)據(jù)庫(kù)中指定(例如,以web形式)用于將來處理的值時(shí)很有用。在這種模式下,mysql只驗(yàn)證月范圍為從0到12,日范圍為從0到31。這些范圍可以包括零,因?yàn)閙ysql允許在date或datetime列保存日/月和日是零的日期。這在應(yīng)用程序需要保存一個(gè)你不知道確切日期的生日時(shí)非常有用。在這種情況下,只需要將日期保存為’1999-00-00’或’1999-01-00’。如果保存此類日期,date_sub()或date_add等需要完整日期的函數(shù)不會(huì)得到正確的結(jié)果。(如果你不想在日期中出現(xiàn)零,可以使用no_zero_in_datesql模式)。

MySQL還允許將’0000-00-00’保存為“偽日期”(如果不使用NO_ZERO_DATE?SQL模式)。這在某些情況下比使用NULL值更方便(并且數(shù)據(jù)和索引占用的空間更小)。

將sql_mode系統(tǒng)變量設(shè)置為相應(yīng)模式值,可以更確切你想讓MySQL支持哪種日期。

當(dāng)使用日期和時(shí)間類型時(shí)應(yīng)記住以下幾點(diǎn):

· MySQL以標(biāo)準(zhǔn)輸出格式檢索給定日期或時(shí)間類型的值,但它盡力解釋你指定的各種輸入值格式(例如,當(dāng)你指定一個(gè)分配給或與日期或時(shí)間類型進(jìn)行比較的值時(shí))。只支持下面章節(jié)中描述的格式。期望你能提供有效值。如果你使用其它格式的值會(huì)發(fā)生意想不到的結(jié)果。

· 包含兩位年值的日期會(huì)令人模糊,因?yàn)槭兰o(jì)不知道。MySQL使用以下規(guī)則解釋兩位年值:

o????????70-99范圍的年值轉(zhuǎn)換為1970-1999。

o????????00-69范圍的年值轉(zhuǎn)換為2000-2069。

· 盡管MySQL嘗試解釋幾種格式的值,日期總是以年-月-日順序(例如,’98-09-04′),而不是其它地方常用的月-日-年或日-月-年順序(例如,’09-04-98’,’04-09-98′)。

· 如果值用于數(shù)值上下文中,MySQL自動(dòng)將日期或時(shí)間類型的值轉(zhuǎn)換為數(shù)字,反之亦然。

· 當(dāng)?MySQL遇到一個(gè)日期或時(shí)間類型的超出范圍或?qū)τ谠擃愋筒缓戏ǖ闹禃r(shí)(如本節(jié)開始所描述),它將該值轉(zhuǎn)換為該類的“零”值。一個(gè)例外是超出范圍的TIME值被裁剪到TIME范圍的相應(yīng)端點(diǎn)。

下面的表顯示了各類“零”值的格式。請(qǐng)注意如果啟用NO_ZERO_DATE?SQL模式,使用這些值會(huì)產(chǎn)生警告。

列類型 ”值
DATETIME ‘0000-00-00 00:00:00’
DATE ‘0000-00-00’
TIMESTAMP 00000000000000
TIME ’00:00:00′
YEAR 0000

· “零”值是特殊值,但你可以使用表內(nèi)顯示的值顯式保存或引用它們。你也可以使用值’0’或0來保存或引用,寫起來更容易。

· MyODBC中使用的“零”日期或時(shí)間值在MyODBC 2.50.12和以上版本中被自動(dòng)轉(zhuǎn)換為NULL,因?yàn)镺DBC不能處理此類值。

1.?DATETIME、DATE和TIMESTAMP類型

  • 1. 自MySQL 4.1以來的TIMESTAMP屬性

DATETIME、DATE和TIMESTAMP類型是相關(guān)的。該節(jié)描述了它們的特征,它們的相似點(diǎn)和不同點(diǎn)。

當(dāng)你需要同時(shí)包含日期和時(shí)間信息的值時(shí)則使用DATETIME類型。MySQL以’YYYY-MM-DD HH:MM:SS’格式檢索和顯示DATETIME值。支持的范圍為’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。(“支持”表示盡管先前的值可能工作,但沒有保證)。

當(dāng)你只需要日期值而不需要時(shí)間部分時(shí)應(yīng)使用DATE類型。MySQL用’YYYY-MM-DD’格式檢索和顯示DATE值。支持的范圍是’1000-01-01’到?‘9999-12-31’。

TIMESTAMP列類型的屬性不固定,取決于MySQL版本和服務(wù)器運(yùn)行的SQL模式。這些屬性將在本節(jié)后面描述。

可以使用任何常見格式指定DATETIME、DATE和TIMESTAMP值:

· ‘YYYY-MM-DD HH:MM:SS’或’YY-MM-DD HH:MM:SS’格式的字符串。允許“不嚴(yán)格”語法:任何標(biāo)點(diǎn)符都可以用做日期部分或時(shí)間部分之間的間割符。例如,’98-12-31 11:30:45’、’98.12.31 11+30+45’、’98/12/31 11*30*45’和’98@12@31 11^30^45’是等價(jià)的。

· ‘YYYY-MM-DD’或’YY-MM-DD’格式的字符串。這里也允許使用“不嚴(yán)格的”語法。例如,’98-12-31’、’98.12.31’、’98/12/31’和’98@12@31’是等價(jià)的。

· ‘YYYYMMDDHHMMSS’或’YYMMDDHHMMSS’格式的沒有間割符的字符串,假定字符串對(duì)于日期類型是有意義的。例如,’19970523091528’和’970523091528’被解釋為’1997-05-23 09:15:28’,但’971122129015’是不合法的(它有一個(gè)沒有意義的分鐘部分),將變?yōu)?#8217;0000-00-00 00:00:00’。

· ‘YYYYMMDD’或’YYMMDD’格式的沒有間割符的字符串,假定字符串對(duì)于日期類型是有意義的。例如,’19970523’和’970523’被解釋為?‘1997-05-23’,但’971332’是不合法的(它有一個(gè)沒有意義的月和日部分),將變?yōu)?#8217;0000-00-00’。

· YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的數(shù)字,假定數(shù)字對(duì)于日期類型是有意義的。例如,19830905132800和830905132800被解釋為?‘1983-09-05 13:28:00’。

· YYYYMMDD或YYMMDD格式的數(shù)字,假定數(shù)字對(duì)于日期類型是有意義的。例如,19830905和830905被解釋為’1983-09-05’。

· 函數(shù)返回的結(jié)果,其值適合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE。

無效DATETIME、DATE或者TIMESTAMP值被轉(zhuǎn)換為相應(yīng)類型的“零”值(‘0000-00-00 00:00:00’、’0000-00-00’或者00000000000000)。

對(duì)于包括日期部分間割符的字符串值,如果日和月的值小于10,不需要指定兩位數(shù)。’1979-6-9’與’1979-06-09’是相同的。同樣,對(duì)于包括時(shí)間部分間割符的字符串值,如果時(shí)、分和秒的值小于10,不需要指定兩位數(shù)。’1979-10-30 1:2:3’與’1979-10-30 01:02:03’相同。

數(shù)字值應(yīng)為6、8、12或者14位長(zhǎng)。如果一個(gè)數(shù)值是8或14位長(zhǎng),則假定為YYYYMMDD或YYYYMMDDHHMMSS格式,前4位數(shù)表示年。如果數(shù)字 是6或12位長(zhǎng),則假定為YYMMDD或YYMMDDHHMMSS格式,前2位數(shù)表示年。其它數(shù)字被解釋為仿佛用零填充到了最近的長(zhǎng)度。

指定為非限定符字符串的值使用給定的長(zhǎng)度進(jìn)行解釋。如果字符串為8或14字符長(zhǎng),前4位數(shù)表示年。否則,前2位數(shù)表示年。從左向右解釋字符串內(nèi)出現(xiàn)的各部分,以發(fā)現(xiàn)年、月、日、小時(shí)、分和秒值。這說明不應(yīng)使用少于6字符的字符串。例如,如果你指定’9903’,認(rèn)為它表示1999年3月,MySQL將在你的表內(nèi)插入一個(gè)“零”日期值。這是因?yàn)槟旰驮轮凳?9和03,但日部分完全丟失,因此該值不是一個(gè)合法的日期。但是,可以明顯指定一個(gè)零值來代表缺少的月或日部分。例如,可以使用’990300’來插入值’1999-03-00’。

在一定程度上,可以將一個(gè)日期類型的值分配給一個(gè)不同的日期類型。但是,值可能會(huì)更改或丟失一些信息:

· 如果你為一個(gè)DATETIME或TIMESTAMP對(duì)象分配一個(gè)DATE值,結(jié)果值的時(shí)間部分被設(shè)置為’00:00:00’,因?yàn)镈ATE值未包含時(shí)間信息。

· 如果你為一個(gè)DATE對(duì)象分配一個(gè)DATETIME或TIMESTAMP值,結(jié)果值的時(shí)間部分被刪除,因?yàn)镈ATE值未包含時(shí)間信息。

· 記住盡管可以使用相同的格式指定DATETIME、DATE和TIMESTAMP值,不同類型的值的范圍卻不同。例如,TIMESTAMP值不能早于1970或晚于2037。這說明一個(gè)日期,例如’1968-01-01’,雖然對(duì)于DATETIME或DATE值是有效的,但對(duì)于TIMESTAMP值卻無效,如果分配給這樣一個(gè)對(duì)象將被轉(zhuǎn)換為0。

當(dāng)指定日期值時(shí)請(qǐng)注意某些缺陷:

· 指定為字符串的值允許的非嚴(yán)格格式可能會(huì)欺騙。例如,值’10:11:12’由于‘:’間割符看上去可能象時(shí)間值,但如果用于日期上下文值則被解釋為年’2010-11-12’。值’10:45:15’被轉(zhuǎn)換為’0000-00-00’因?yàn)?#8217;45’不是合法月。

· 在非嚴(yán)格模式,MySQL服務(wù)器只對(duì)日期的合法性進(jìn)行基本檢查:年、月和日的范圍分別是1000到9999、00到12和00到31。任何包含超出這些范圍的部分的日期被轉(zhuǎn)換成’0000-00-00’。請(qǐng)注意仍然允許你保存非法日期,例如’2002-04-31’。要想確保不使用嚴(yán)格模式時(shí)日期有效,應(yīng)檢查應(yīng)用程序。

在嚴(yán)格模式,非法日期不被接受,并且不轉(zhuǎn)換。

· 包含兩位年值的日期會(huì)令人模糊,因?yàn)槭兰o(jì)不知道。MySQL使用以下規(guī)則解釋兩位年值:

o????????00-69范圍的年值轉(zhuǎn)換為2000-2069。

o????????70-99范圍的年值轉(zhuǎn)換為1970-1999。

1.1.?自MySQL 4.1以來的TIMESTAMP屬性

注釋:在舊版本的MySQL中(4.1之前),TIMESTAMP列類型的屬性在許多方面于本節(jié)所描述的大大不同。如果你需要對(duì)舊的TIMESTAMP數(shù)據(jù)進(jìn)行轉(zhuǎn)化以便在MySQL 5.1中工作,詳情請(qǐng)參見MySQL 4.1?參考手冊(cè)

TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。

MySQL服務(wù)器也可以以MAXDB模式運(yùn)行。當(dāng)服務(wù)器以該模式運(yùn)行時(shí),TIMESTAMP與DATETIME相等。也就是說,如果創(chuàng)建表時(shí)服務(wù)器以MAXDB模式運(yùn)行,TIMESTAMP列創(chuàng)建為DATETIME列。結(jié)果是,該列使用DATETIME顯示格式,有相同的值范圍,并且沒有自動(dòng)對(duì)當(dāng)前的日期和時(shí)間進(jìn)行初始化或更新。

要想啟用MAXDB模式,在啟動(dòng)服務(wù)器時(shí)使用–sql-mode=MAXDB服務(wù)器選項(xiàng)或在運(yùn)行時(shí)通過設(shè)置全局sql_mode變量將SQL服務(wù)器模式設(shè)置為MAXDB:

mysql>?SET?GLOBAL?sql_mode=MAXDB;

客戶端可以按照下面方法讓服務(wù)器為它的連接以MAXDB模式運(yùn)行:

mysql>?SET?SESSION?sql_mode=MAXDB;

MySQL不接受在日或月列包括一個(gè)零或包含非法日期值的時(shí)間戳值。該規(guī)則的唯一例外是特殊值’0000-00-00 00:00:00’。

你可以非常靈便地確定什么時(shí)候初始化和更新TIMESTAMP和對(duì)哪些列進(jìn)行初始化和更新:

· 你可以將當(dāng)前的時(shí)間戳指定為默認(rèn)值和自動(dòng)更新的值。但只能選擇一個(gè),或者兩者都不選。(不可能一個(gè)列選擇一個(gè)行為而另一個(gè)列選擇另一個(gè)行為)。

· 你可以指定哪個(gè)TIMESTAMP列自動(dòng)初始化或更新為當(dāng)前的日期和時(shí)間。不再需要為第1個(gè)TIMESTAMP列。

請(qǐng)注意下面討論所信息只適用于創(chuàng)建時(shí)未啟用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列創(chuàng)建為DATETIME列)??刂芓IMESTAMP列的初始化和更新的規(guī)則如下所示:

· 如果一個(gè)表內(nèi)的第1個(gè)TIMESTAMP列指定為一個(gè)DEFAULT值,則不能忽略。 默認(rèn)值可以為CURRENT_TIMESTAMP或常量日期和時(shí)間值。

· DEFAULT NULL與第1個(gè)TIMESTAMP?列的DEFAULT CURRENT_TIMESTAMP相同。對(duì)于其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0。

· 表內(nèi)的任何一個(gè)TIMESTAMP列可以設(shè)置為自動(dòng)初始化為當(dāng)前時(shí)間戳和/或更新。

· 在CREATE TABLE語句中,可以用下面的任何一種方式聲明第1個(gè)TIMESTAMP列:

o????????用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列為默認(rèn)值使用當(dāng)前的時(shí)間戳,并且自動(dòng)更新。

o????????不使用DEFAULT或ON UPDATE子句,與DEFAULT CURRENT_TIMESTAMP?ON UPDATECURRENT_TIMESTAMP相同。

o????????用DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列為默認(rèn)值使用當(dāng)前的時(shí)間戳但是不自動(dòng)更新。

o????????不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有默認(rèn)值0并自動(dòng)更新。

o????????用常量DEFAULT值,列有給出的 默認(rèn)值。如果列有一個(gè)ON UPDATE CURRENT_TIMESTAMP子句,它自動(dòng)更新,否則不。

換句話說,你可以為初始值和自動(dòng)更新的值使用當(dāng)前的時(shí)間戳,或者其中一個(gè)使用,或者兩個(gè)皆不使用。(例如,你可以指定ON UPDATE來啟用自動(dòng)更新而不讓列自動(dòng)初始化)。

· 在DEFAULT和ON UPDATE子句中可以使用CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()或者NOW()。它們均具有相同的效果。

兩個(gè)屬性的順序并不重要。如果一個(gè)TIMESTAMP列同時(shí)指定了DEFAULT和ON UPDATE,任何一個(gè)可以在另一個(gè)的前面。

例子,下面這些語句是等效的:

CREATE?TABLE?t?(ts?TIMESTAMP);  CREATE?TABLE?t?(ts?TIMESTAMP?DEFAULT?CURRENT_TIMESTAMP  ?????????????????????????????ON?UPDATE?CURRENT_TIMESTAMP);  CREATE?TABLE?t?(ts?TIMESTAMP?ON?UPDATE?CURRENT_TIMESTAMP  ?????????????????????????????DEFAULT?CURRENT_TIMESTAMP);

· 要為TIMESTAMP列而不是第1列指定自動(dòng)默認(rèn)或更新,必須通過將第1個(gè)TIMESTAMP列顯式分配一個(gè)常量DEFAULT值來禁用自動(dòng)初始化和更新。(例如,DEFAULT 0或DEFAULT’2003-01-01 00:00:00′)。然后,對(duì)于其它TIMESTAMP列,規(guī)則與第1個(gè)TIMESTAMP列相同,例外情況是不能忽略DEFAULT和ON UPDATE子句。如果這樣做,則不會(huì)自動(dòng)進(jìn)行初始化或更新。

例如:下面這些語句是等效的:

CREATE?TABLE?t?(  ????ts1?TIMESTAMP?DEFAULT?0,  ????ts2?TIMESTAMP?DEFAULT?CURRENT_TIMESTAMP  ??????????????????ON?UPDATE?CURRENT_TIMESTAMP);  CREATE?TABLE?t?(  ????ts1?TIMESTAMP?DEFAULT?0,  ????ts2?TIMESTAMP?ON?UPDATE?CURRENT_TIMESTAMP  ??????????????????DEFAULT?CURRENT_TIMESTAMP);

可以對(duì)每個(gè)連接設(shè)置當(dāng)前的時(shí)區(qū)。TIMESTAMP值以UTC格式保存,存儲(chǔ)時(shí)對(duì)當(dāng)前的時(shí)區(qū)進(jìn)行轉(zhuǎn)換,檢索時(shí)再轉(zhuǎn)換回當(dāng)前的時(shí)區(qū)。只要時(shí)區(qū)設(shè)定值為常量,便可以得到保存時(shí)的值。如果保存一個(gè)TIMESTAMP值,應(yīng)更改時(shí)區(qū)然后檢索該值,它與你保存的值不同。這是因?yàn)樵趦蓚€(gè)方向的轉(zhuǎn)換中沒有使用相同的時(shí)區(qū)。當(dāng)前的時(shí)區(qū)可以用作time_zone系統(tǒng)變量的值。

可以在TIMESTAMP列的定義中包括NULL屬性以允許列包含NULL值。例如:

CREATE?TABLE?t  (  ??ts1?TIMESTAMP?NULL?DEFAULT?NULL,  ??ts2?TIMESTAMP?NULL?DEFAULT?0,  ??ts3?TIMESTAMP?NULL?DEFAULT?CURRENT_TIMESTAMP  );

如果未指定NULL屬性,將列設(shè)置為NULL設(shè)置則會(huì)將它設(shè)置為當(dāng)前的時(shí)間戳。請(qǐng)注意允許NULL值的TIMESTAMP列不會(huì)采用當(dāng)前的時(shí)間戳,除非要么其 默認(rèn)值定義為CURRENT_TIMESTAMP,或者NOW()或CURRENT_TIMESTAMP被插入到該列內(nèi)。換句話說,只有使用如下定義創(chuàng)建,定義為?NULL的TIMESTAMP列才會(huì)自動(dòng)更新:

CREATE?TABLE?t?(ts?NULLDEFAULT?CURRENT_TIMESTAMP);

否則-也就是說,如果使用NULL而不是DEFAULT TIMESTAMP來定義TIMESTAMP列,如下所示…

CREATE?TABLE?t1?(ts?NULL?DEFAULT?NULL);  CREATE?TABLE?t2?(ts?NULL?DEFAULT?'0000-00-00?00:00:00');

…則必須顯式插入一個(gè)對(duì)應(yīng)當(dāng)前日期和時(shí)間的值。例如:

INSERT?INTO?t1?VALUES?(NOW());  INSERT?INTO?t2?VALUES?(CURRENT_TIMESTAMP);

2.?TIME類型

MySQL以’HH:MM:SS’格式檢索和顯示TIME值(或?qū)τ诖蟮男r(shí)值采用’HHH:MM:SS’格式)。TIME值的范圍可以從’-838:59:59’到’838:59:59’。小時(shí)部分會(huì)因此大的原因是TIME類型不僅可以用于表示一天的時(shí)間(必須小于24小時(shí)),還可能為某個(gè)事件過去的時(shí)間或兩個(gè)事件之間的時(shí)間間隔(可以大于24小時(shí),或者甚至為負(fù))。

你可以用各種格式指定TIME值:

· ‘D HH:MM:SS.fraction’格式的字符串。還可以使用下面任何一種“非嚴(yán)格”語法:’HH:MM:SS.fraction’、’HH:MM:SS’、’HH:MM’、’D HH:MM:SS’、’D HH:MM’、’D HH’或’SS’。這里D表示日,可以取0到34之間的值。請(qǐng)注意MySQL還不保存分?jǐn)?shù)。

· ‘HHMMSS’格式的沒有間割符的字符串,假定是有意義的時(shí)間。例如,’101112’被理解為’10:11:12’,但’109712’是不合法的(它有一個(gè)沒有意義的分鐘部分),將變?yōu)?#8217;00:00:00’。

· HHMMSS格式的數(shù)值,假定是有意義的時(shí)間。例如,101112被理解為’10:11:12’。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。請(qǐng)注意MySQL還不保存分?jǐn)?shù)。

· 函數(shù)返回的結(jié)果,其值適合TIME上下文,例如CURRENT_TIME。

對(duì)于指定為包括時(shí)間部分間割符的字符串的TIME值,如果時(shí)、分或者秒值小于10,則不需要指定兩位數(shù)。’8:3:2’與’08:03:02’相同。

為TIME列分配簡(jiǎn)寫值時(shí)應(yīng)注意。沒有冒號(hào),MySQL解釋值時(shí)假定最右邊的兩位表示秒。(MySQL解釋TIME值為過去的時(shí)間而不是當(dāng)天的時(shí)間)。例如,你可能認(rèn)為’1112’和1112表示’11:12:00′(11點(diǎn)過12分),但MySQL將它們解釋為’00:11:12′(11分,12?秒)。同樣,’12’和12?被解釋為?’00:00:12’。相反,TIME值中使用冒號(hào)則肯定被看作當(dāng)天的時(shí)間。也就是說,’11:12’表示’11:12:00’,而不是’00:11:12’。

超出TIME范圍但合法的值被裁為范圍最接近的端點(diǎn)。例如,’-850:00:00’和’850:00:00’被轉(zhuǎn)換為’-838:59:59’和’838:59:59’。

無效TIME值被轉(zhuǎn)換為’00:00:00’。請(qǐng)注意由于’00:00:00’本身是一個(gè)合法TIME值,只從表內(nèi)保存的一個(gè)’00:00:00’值還不能說出原來的值是?’00:00:00’還是不合法的值。

3.?YEAR類型

YEAR類型是一個(gè)單字節(jié)類型用于表示年。

MySQL以YYYY格式檢索和顯示YEAR值。范圍是1901到2155。

可以指定各種格式的YEAR值:

· 四位字符串,范圍為’1901’到’2155’。

· 四位數(shù)字,范圍為1901到2155。

· 兩位字符串,范圍為’00’到’99’。’00’到’69’和’70’到’99’范圍的值被轉(zhuǎn)換為2000到2069和1970到1999范圍的YEAR值。

· 兩位整數(shù),范圍為1到99。1到69和70到99范圍的值被轉(zhuǎn)換為2001到2069和1970到1999范圍的YEAR值。請(qǐng)注意兩位整數(shù)范圍與兩位字符串范圍稍有不同,因?yàn)槟悴荒苤苯訉⒘阒付閿?shù)字并將它解釋為2000。你必須將它指定為一個(gè)字符串’0’或’00’或它被解釋為0000。

· 函數(shù)返回的結(jié)果,其值適合YEAR上下文,例如NOW()。

非法YEAR值被轉(zhuǎn)換為0000。

4.?Y2K事宜和日期類型

MySQL本身對(duì)于2000年(Y2K)是安全的,但輸入給MySQL的值可能不安全。任何包含兩位年值的輸入都會(huì)令人模糊,因?yàn)槭兰o(jì)不知道。這些值必須解釋為四位形式,因?yàn)镸ySQL內(nèi)部使用四位來保存年。

對(duì)于DATETIME、DATE、TIMESTAMP和YEAR類型,MySQL使用以下規(guī)則解釋含模糊年值的日期:

· 00-69范圍的年值轉(zhuǎn)換為2000-2069。

· 70-99范圍的年值轉(zhuǎn)換為1970-1999。

請(qǐng)記住這些規(guī)則只是合理猜測(cè)數(shù)據(jù)值表示什么。如果MySQL使用的啟發(fā)不能產(chǎn)生正確的值,你應(yīng)提供包含四位年值的確切輸入。

ORDER BY可以正確排序有兩位年的TIMESTAMP或YEAR值。

部分函數(shù)如MIN()和MAX()將TIMESTAMP或YEAR轉(zhuǎn)換為一個(gè)數(shù)字。這說明使用有兩位年值的值,這些函數(shù)不能工作正確。在這種情況下的修復(fù)方法是將TIMESTAMP或YEAR轉(zhuǎn)換為四位年格式或使用MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS))。

?以上就是MySQL基礎(chǔ)教程2 —— 數(shù)據(jù)類型之日期和時(shí)間類型的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享