一、基本
如果要讓這些字段存放諸如"2009-00-00"或"2009-11-31"之類的值,那么要為MySQL指定特別的SQL_MODE。
如果沒有使用NO_ZERO_DATE的SQL_MODE,那么MySQL允許存放"0000-00-00"的值,有時候這樣的值比null值方便。
(注意:TRADITIONAL模式也包含了NO_ZERO_DATE模式)
MySQL用標准格式輸出時間,但解析某字符串成世界時,嘗試多種格式。
年份若只有2位,70-99年解釋為1970-1999年,00-69年解釋為2000-2069年
要想被解析成時間,字符串總應該是“年-月-日”次序。
如果時間用在一個數字型的上下文中,時間將自動轉為1個數字。
如果解析時,超過日期或時間表示范圍,MySQL自動將其轉為“零”值:(如果使用NO_ZERO_DATE模式,那么會產生warning)
datetime '0000-00-00 00:00:00'
date '0000-00-00'
timestamp '0000-00-00 00:00:00'
time '00:00:00'
year 0000
“零”值是特殊的,但可以直接用這些值,這些值可以簡單地寫成'0'或0
在MyODBC2.50.12及以上版本中,“零”值自動轉為null值,因為MyODBC不能處理。
二、datetime,date和timestamp類型
datetime 顯示為'YYYY-MM-DD HH:MM:SS'格式,范圍為'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
date 顯示為'YYYY-MM-DD'格式,范圍為'1001-01-01'到'9999-12-31'
timestamp 范圍從'1970-01-01 00:00:01'UTC 到'2038-01-09 03:14:07'UTC
1. 指定值
指定datetime值時,可以用'2009-01-01 11:20:30','2009/01/01 11*20*30','2009*01*01 11^20^30','2009@01@01 11+20+30'等,效果是一樣的。
指定date值時,與上類似。
指定datetime值時,也可以用字符串'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式,如'20090101112030'或'090101112030',但'20090101119030'(分鍾為90)會被解析為“零”值:'0000-00-00 00:00:00'。
指定date值時,與上類似。
指定datetime值時,也可以用數字YYYYMMDDHHMMSS或YYMMDDHHMMSS格式,如20090101112030或090101112030。
指定date值時,與上類似。
指定datetime、date或timestamp值時,也可以用now()或current_date的值。
指定datetime、date或timestamp值時,月、日、時、分、秒,若小於10,可以只寫1位,如'2009-01-01 11:30:30'與'2009-1-1 11:30:30'一樣。
用數字指定時間時,可以為6、8、12或14位,6位表示YYMMDD,8位表示YYYYMMDD,12位表示YYMMDDHHMMSS,14位表示YYYYMMDDHHMMSS。
用不帶分割符的字符串指定時間時,如果字符串為8位或14位的,那么認為年份為YYYY,否則認為年份為YY,之后按順序解析月日時分秒。
2. 不同類型轉換
date值賦給datetime或timestamp時,時間部分為'00:00:00'。
datetime或timestamp值賦給date時,時間部分被去掉。
轉換時注意其表示范圍有所不同,超出范圍的將被轉為“零”值。
3. 注意'10:11:12'會被轉為'2010-11-12 00:00:00'或'2010-11-12'。
4. timestamp類型
從當前時區轉成UTC保存,要讀取時,再從UTC轉成當前時區。(不發生在datetime類型上)。
當前時區對應time_zone系統變量(缺省值為'System'表示用系統變量system_time_zone的值)
系統變量system_time_zone的值在啟動MySQL時指定,一般去TZ環境變量,或執行mysqld_safe時用--timezone選項。
(linux安裝時挑選時區,安裝后時區保存在/etc/sysconfig/clock文件里。)
若將timestamp類型字段定義為default current_timestamp,那么插入一條記錄時,該timestamp字段自動被賦值為當前時間。
若將timestamp類型字段定義為on update current_timestamp,那么修改一條記錄時,該timestamp字段自動被修改為當前時間。
在一個表里面的timestamp字段只能有下面4種定義:
a. 是default current_timestamp
插入時系統自動賦值,插入時若在SQL語句中指定該字段的值,則用SQL語句中的指定值。
修改時時間值不自動改變,但可以在SQL語句中指定其值。
b. 是on update current_timestamp
插入時系統不自動賦值(字段為“零”值),但可以在SQL語句中指定該字段的值。
修改時,系統自動賦值,但若SQL語句中指定其值,則用SQL語句中的指定值。
c.兩個都有default current_timestamp on update current_timestamp
如果timestamp后面啥都不寫,也相當於2個都有。
插入修改時系統自動賦值,SQL語句中若指定,則用SQL語句中的指定值。
d.如果default 后面寫個常數,如default 20090101010000,那么插入時即為這個值。其他與上面類似。
另外,一個表里面,如果想定義第2個timestamp字段,而且想讓第2個字段有系統自動修改的機制,
那么之前的那個字段一定要賦予default 常數(即上面d),
然后,再給這個新的timestamp字段進行如上abc的定義,區別是這個新的timestamp字段不能后面啥不都寫,
如果啥都不寫,那么插入和修改時系統不會自動賦值。
依次類推,再想定義第3個timestamp字段,而且想讓第3個字段有系統自動修改的機制,
那么之前第2個timestamp字段一定要賦予default 常數(即上面d),
然后,再給這個新的timestamp字段進行如上abc的定義,區別跟前面一樣。
上述current_timestamp還可以用它的同義詞current_timestamp(),now(),localtime,localtime(),localtimestamp,localtimestamp()代替。
timestamp字段缺省不允許空值,如果指定它的值為null,實際上就是用當前時間值賦給他了。
但是,可以這樣定義:
col1 timestamp null default null, 注釋:該字段可以為null,插入時缺省就是null,如果賦值null,那也真是null而不是當前時間值。
col2 timestamp null default 0, 注釋:該字段可以null,插入時缺省為0,如果賦值null,那也真是null而不是當前時間值。
如果MySQL服務器以MAXDB SQL模式運行,那么timestamp等同於datetime類型,前面說的timestamp類型的所有描述都消失。
三、time類型
'HH:MM:SS'或'HHH:MM:SS'格式,范圍為'-838:59:59'到'838:59:59'。
之所以小時值可以范圍這么大,是因為time類型還可以用來表示兩個時間點之差。
格式可以為'D HH:MM:SS.fraction',其中D指示天(0~34),MySQL不存儲D和fraction值。
可以為'D HH','HH:MM','HH:MM:SS','D HH','SS',不能為'MM',或'HH'。注意:'11:12'被解釋為'11:12:00'。
數字格式HHMMSS,可以為SS,MMSS,HHMMSS,HHMMSS.fraction,不能為MM或HH。注意:1112被解釋為'00:11:12'。
對於字符型來講,時分秒如果小於10,可以寫成1位。
合法的越界的值將被MySQL自動轉換成靠近它的邊界值,如'-850:00:00'被轉換為'-838:59:59'。
不合法的值被MySQL自動轉換為“零”值:'00:00:00'。 表中的0值不能區分是真實存儲的0值還是因為不合法而被轉換的0值。
四、year類型
year(2)或year(4),缺省為year(4)
year(2) 范圍為70(1970)-69(2069),數字0表示2000年,'0'表示“零”值:0000
year(4) 范圍為1901-2155
SQL語句中的Min(),Max()將把year轉換成1個數字,在某些時候會產生問題。
五、存儲空間
date 3個字節
time 3個字節
datetime 8個字節
timestamp 4個字節
year 1個字節