标签归档:mysql

[转载]MySQL 5.6 中 TIMESTAMP 的变化

注:阿里云现行使用的 MySQL RDS 版本为 5.6,小版本未知,且未开放 explicit_defaults_for_timestamp 参数的设置

本文转载自:http://www.williamsang.com/archives/818.html

在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′,且没有警告。

MySQL5.6-MyISAM-timestamp

MySQL5.6-MyISAM-2timestamp
2列TIMESTAMP未声明为NULL的默认行为

从MySQL5.6.6开始这种默认设置的方法被废弃了。在MySQL启动时会出现以下警告:

1
2
3
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option
(seedocumentation for more details).

关闭警告,在my.cnf中加入

1
2
[mysqld]
explicit_defaults_for_timestamp=true

重启MySQL后错误消失,这时TIMESTAMP的行为如下:

  • TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为。
  • TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。

MySQL5.6-INNODB-timestampTIMESTAMP 不设置是否为NULL

  • 声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的。往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一个错误,如果严格SQL模式没有启用,该列会赋值为’0000-00-00 00:00:00′,同时出现一个警告。(这和MySQL处理其他时间类型数据一样,如DATETIME)

MySQL5.6-INNODB-timestamp-NOT-NULL
TIMESTAMP 默认设置为NOT NULL

Note:

以上内容和存储引擎选择无关。

MySql连接问题

由于最新版MYSQL服务器的密码算法与原有的不一样,导致用ODBC或PHP中连接不上。
所以安装好后,请用管理员帐号登录后执行如下命令:

use mysql
SET PASSWORD FOR ‘yourname’@’localhost’ = OLD_PASSWORD(‘yourpass’);

这样就把密码改为原来的加密方式了。

WP在高版本MySql下的乱码问题

上次给simamy转移空间的时候碰到过
昨天给bianbian安装的时候又碰到了

一开始以为只有升级才会出现乱码
没想到新安装的也有这个问题

关于乱码问题的解释

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章”Character Set Support“后终于找到了解决方法并测试通过。

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:


SET NAMES ‘utf8’;

在wordpress中的解决办法

修改wp-includes/wp-db.php


$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面这行
$this->query(“SET NAMES ‘utf8′”);

以上前提是数据库的collation设置为utf8_general_ci