vlambda博客
学习文章列表

软件开发之004--mysql的几个注意事项

   今天工作中遇到了几个mysql特殊注意事项。

 一、explicit_defaults_for_timestamp

explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。此变量自MySQL 5.6.6 版本引入,分为全局级别和会话级别,可动态更新,默认值为OFF正是由于下面的区别,所以在创建数据库之前在[mysqld]面将explicit_defaults_for_timestamp设置为true.同时考虑到timestamp的局限性,建议全部换成datetime.

1、当该参数默认设置为OFF时,其行为如下:

  • 在默认情况下,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。

  • 表中的第一个timestamp列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。

  • 对于其它TIMESTAMP列,如果没有显示指定NULL和DEFAULT属性的话,会自动设置为NOT NULL DEFAULT '0000-00-00 00:00:00'。(当然,这个与SQL_MODE有关,如果SQL_MODE中包含'NO_ZERO_DATE',实际上是不允许将其默认值设置为'0000-00-00 00:00:00'的。)


2、当该参数设置为ON时,其行为如下:

  • 如果timestamp列没有显式的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。

  • 不会自动的为表中的第一个timestamp列加上DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP属性。

  • 如果timestamp列被加上了not null属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该TIMESTAMP列指定值的时候,如果strict sql_mode被指定了,那么会直接报错。如果strict sql_mode没有被指定,那么会向该列中插入'0000-00-00 00:00:00'并且产生一个warning。


二、datetime和timestamp的区别

比较项
datetime
timestamp
占用空间
8字节
4字节
表示范围
'1000-01-01 00:00:00' to '9999-12-31 23:59:59' '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07'UTC
时区
不会进行时区检索,存的是什么取出来就是什么
查询或者保存时自动检索当前时区并进行转换
表现形式 yyyy-mm-dd hh:mm:ss yyyy-mm-dd hh:mm:ss

2038年不远了,所以还是建议使用datetime吧。


三、Shell读取mysql

因为要在linux shell中读取mysql数据库,所以需要在/etc/my.cnf增加数据库密码:

[client]password=*****


四、生活如此美好,好不惬意人生

1、早晨起床,阳光明媚,生活如此美好;

2、下午下班后跑步,然后一起吃饭,好不惬意人生

3、啰里啰嗦写的那么多,感觉自己就是一个空军,买啥跌啥。