timestamp的行为规则比较复杂,并且不同版本的MySQL会有变动,那么有时候"经验主义"便会让人踢到铁板,所以我们应该验证数据库的行为是你需要的,比较好的做法是,修改完timestamp列后用show create table命令检查输出,以下是同一个DDL语句在不同版本的timestamp展现
create table t (col timestamp); 5.1表现为: `col` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 5.5 层现是: `col` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 5.6 则为: `col` timestamp NULL DEFAULT NULL可见,timestamp在5.6版本的变化是翻天覆地的。
随着经济全球化日益激烈,跨时区倒数据已是家常便饭。创建数据和schema的逻辑备份最常见的选择还是mysqldump,但当我们打开dump文件头会发现" /*!40103 SET TIME_ZONE='+00:00' */; "这么一行。而我们的客户端默认时区是:
mysql> select @@time_zone; +-------------+ | @@time_zone | +-------------+ | SYSTEM | +-------------+ 1 row in set (0.00 sec)
mysql> drop table if exists t; mysql> create table t (col timestamp); mysql> insert into t select now(); mysql> select * from t; +---------------------+ | col | +---------------------+ | 2014-01-25 10:42:44 | +---------------------+ 1 row in set (0.00 sec)
$ mysqldump -uroot -poracle testdb t --where='col="2014-01-25 10:42:44"' | grep INSERT
返回空,导不出数据?下面给出2种解决方案
方法一 加上参数 --tz-utc
$ mysqldump -uroot -p testdb t --tz-utc=0 --where='col="2014-01-25 10:42:44"' | grep INSERT
方法二 用转换函数处理
mysql> select unix_timestamp(col) from t; +---------------------+ | unix_timestamp(col) | +---------------------+ | 1390617764 | +---------------------+$ mysqldump -uroot -p testdb t --where='col=from_unixtime(1390617764)' | grep INSERT
INSERT INTO `t` VALUES ('2014-01-25 02:42:44');
㈡ 数据类型转换
基本原则:
① 不要在字段前增加函数
如:
② 不要把字段嵌入到表达式中
举个例子吧、假设我在字符列上建立个索引、然后:
㈢ 数据类型优化
下面总结我认为优化数据类型的几条通用原则为:
1、数据类型更小通常更好,数据类型越简单越好
5、多使用enum,set
6、IP用int存:inet_aton()、inet_ntoa()
7、使用decimal而不是float & double
8、MyISAM多使用char、InnoDB多使用varchar