MySQL 9.0 版本注意事項
MySQL 支援 TIME
、DATETIME
和 TIMESTAMP
值的小數秒,精度最高可達微秒(6 位數)。
若要定義包含小數秒部分的欄位,請使用語法
,其中type_name
(fsp
)type_name
是TIME
、DATETIME
或TIMESTAMP
,而fsp
是小數秒的精度。例如:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
若給定
fsp
值,則該值必須在 0 到 6 的範圍內。值 0 表示沒有小數部分。如果省略,則預設精度為 0。(為了與先前的 MySQL 版本相容,這與標準 SQL 的預設值 6 不同。)將具有小數秒部分的
TIME
、DATE
或TIMESTAMP
值插入到相同類型但小數位數較少的欄位中會導致捨入。考慮如下建立和填入的表格:CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) ); INSERT INTO fractest VALUES ('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777');
時間值會經過捨入後插入表格中:
mysql> SELECT * FROM fractest; +-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:04.78 | +-------------+------------------------+------------------------+
發生此類捨入時,不會發出警告或錯誤。此行為遵循 SQL 標準。
若要改為以截斷方式插入值,請啟用
TIME_TRUNCATE_FRACTIONAL
SQL 模式:SET @@sql_mode = sys.list_add(@@sql_mode, 'TIME_TRUNCATE_FRACTIONAL');
啟用該 SQL 模式後,時間值會以截斷方式插入:
mysql> SELECT * FROM fractest; +-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.77 | 2018-09-08 17:51:04.77 | 2018-09-08 17:51:04.77 | +-------------+------------------------+------------------------+
接受時間引數的函式會接受具有小數秒的值。時間函式的傳回值會適當地包含小數秒。例如,不帶引數的
NOW()
會傳回不帶小數部分的目前日期和時間,但會採用一個從 0 到 6 的選用引數,以指定傳回值包含的小數位數的小數秒部分。時間常值的語法會產生時間值:
DATE '
、str
'TIME '
和str
'TIMESTAMP '
,以及 ODBC 語法等效項。如果指定,產生的值會包含尾隨的小數秒部分。先前,時間類型關鍵字會被忽略,而這些結構會產生字串值。請參閱 標準 SQL 和 ODBC 日期和時間常值。str
'