這篇文章主要介紹了MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 參數,需要的朋友可以參考下
安裝MySQL時,有warning:
- [root@localhost mysql]# scripts/mysql_install_db --user=mysql
- Installing MySQL system tables...2015-08-13 14:20:09 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
- 2015-08-13 14:20:09 0 [Note] ./bin/mysqld (mysqld 5.6.26) starting as process 1934 ...
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Using mutexes to ref count buffer pool pages
- 2015-08-13 14:20:09 1934 [Note] InnoDB: The InnoDB memory heap is disabled
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Mutexes and rw_locks use InnoDB's own implementation
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Memory barrier is not used
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Compressed tables use zlib 1.2.3
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Using Linux native AIO
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Not using CPU crc32 instructions
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Initializing buffer pool, size = 128.0M
- 2015-08-13 14:20:09 1934 [Note] InnoDB: Completed initialization of buffer pool
- 2015-08-13 14:20:10 1934 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created!
- 2015-08-13 14:20:10 1934 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB
- 2015-08-13 14:20:10 1934 [Note] InnoDB: Database physically writes the file full: wait...
- 2015-08-13 14:20:10 1934 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB
- 2015-08-13 14:20:11 1934 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
- 2015-08-13 14:20:12 1934 [Warning] InnoDB: New log files created, LSN=45781
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Doublewrite buffer not found: creating new
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Doublewrite buffer created
- 2015-08-13 14:20:12 1934 [Note] InnoDB: 128 rollback segment(s) are active.
- 2015-08-13 14:20:12 1934 [Warning] InnoDB: Creating foreign key constraint system tables.
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Foreign key constraint system tables created
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Creating tablespace and datafile system tables.
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Tablespace and datafile system tables created.
- 2015-08-13 14:20:12 1934 [Note] InnoDB: Waiting for purge to start
- 2015-08-13 14:20:12 1934 [Note] InnoDB: 5.6.26 started; log sequence number 0
- 2015-08-13 14:20:14 1934 [Note] Binlog end
- 2015-08-13 14:20:14 1934 [Note] InnoDB: FTS optimize thread exiting.
- 2015-08-13 14:20:14 1934 [Note] InnoDB: Starting shutdown...
- 2015-08-13 14:20:16 1934 [Note] InnoDB: Shutdown completed; log sequence number 1625977
OK
- Filling help tables...2015-08-13 14:20:16 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
- Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
- 2015-08-13 14:20:16 0 [Note] ./bin/mysqld (mysqld 5.6.26) starting as process 1957 ...
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Using mutexes to ref count buffer pool pages
- 2015-08-13 14:20:16 1957 [Note] InnoDB: The InnoDB memory heap is disabled
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Mutexes and rw_locks use InnoDB's own implementation
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Memory barrier is not used
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Compressed tables use zlib 1.2.3
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Using Linux native AIO
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Not using CPU crc32 instructions
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Initializing buffer pool, size = 128.0M
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Completed initialization of buffer pool
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Highest supported file format is Barracuda.
- 2015-08-13 14:20:16 1957 [Note] InnoDB: 128 rollback segment(s) are active.
- 2015-08-13 14:20:16 1957 [Note] InnoDB: Waiting for purge to start
- 2015-08-13 14:20:16 1957 [Note] InnoDB: 5.6.26 started; log sequence number 1625977
- 2015-08-13 14:20:17 1957 [Note] Binlog end
- 2015-08-13 14:20:17 1957 [Note] InnoDB: FTS optimize thread exiting.
- 2015-08-13 14:20:17 1957 [Note] InnoDB: Starting shutdown...
- 2015-08-13 14:20:18 1957 [Note] InnoDB: Shutdown completed; log sequence number 1625987
OK
- To start mysqld at boot time you have to copy
- support-files/mysql.server to the right place for your system
- PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
- To do so, start the server, then issue the following commands:
- ./bin/mysqladmin -u root password 'new-password'
- ./bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
- Alternatively you can run:
- ./bin/mysql_secure_installation
- which will also give you the option of removing the test
- databases and anonymous user created by default. This is
- strongly recommended for production servers.
- See the manual for more instructions.
- You can start the MySQL daemon with:
- cd . ; ./bin/mysqld_safe &
- You can test the MySQL daemon with mysql-test-run.pl
- cd mysql-test ; perl mysql-test-run.pl
- Please report any problems at http://bugs.mysql.com/
- The latest information about MySQL is available on the web at
- http://www.mysql.com
- Support MySQL by buying support/licenses at http://shop.mysql.com
- New default config file was created as ./my.cnf and
- will be used by default by the server when you start it.
- You may edit this file to change server settings
- WARNING: Default config file /etc/my.cnf exists on the system
- This file will be read by default by the MySQL server
- If you do not want to use this, either remove it, or use the
- --defaults-file argument to mysqld_safe when starting the server
- [root@localhost mysql]#
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
其原因是從 5.6開始,timestamp 的默認行為已經是 deprecated 了。
在MySQL 5.6.6之前,TIMESTAMP的默認行為:
TIMESTAMP列如果沒有明確聲明NULL屬性,默認為NOT NULL。(而其他數據類型,如果沒有顯示聲明為NOT NULL,則允許NULL值。)設置TIMESTAMP的列值為NULL,會自動存儲為當前timestamp。
表中的第一個TIMESTAMP列,如果沒有聲明NULL屬性、DEFAULT或者 ON UPDATE,會自動分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性。
表中第二個TIMESTAMP列,如果沒有聲明為NULL或者DEFAULT子句,默認自動分配'0000-00-00 00:00:00′。插入行時沒有指明改列的值,該列默認分配'0000-00-00 00:00:00′,且沒有警告。
要關閉警告,需要加入下面的參數:
- explicit_defaults_for_timestamp=true
重啟MySQL后錯誤消失,這時TIMESTAMP的行為如下:
TIMESTAMP如果沒有顯示聲明NOT NULL,是允許NULL值的,可以直接設置改列為NULL,而沒有默認填充行為。
TIMESTAMP不會默認分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP屬性。
聲明為NOT NULL且沒有默認子句的TIMESTAMP列是沒有默認值的。往數據表中插入列,又沒有給TIMESTAMP列賦值時,如果是嚴格SQL模式,會拋出一 個錯誤,如果嚴格SQL模式沒有啟用,該列會賦值為'0000-00-00 00:00:00′,同時出現一個警告。(這和MySQL處理其他時間類型數據一樣,如DATETIME)
也就是 explicit_defaults_for_timestamp 關閉了 timestamp 類型字段鎖擁有的一些會讓人感到奇怪的默認行為,加入了該參數之后,如果還需要為 timestamp類型的字段指定默認行為,那么就需要顯示的在創建表時顯示的指定。explicit_defaults_for_timestamp 也就是這個意思:顯示指定默認值為timestamp類型的字段。
新聞熱點
疑難解答