Set default value of datetime columns to CURRENT_TIMESTAMP

This resolves an issue with MySQL 5.7 where the default SQL_MODE is set to disallow zero dates (i.e. '0000-00-00 00:00:00')
Fixed thanks to Francis and Normandy from postActiv.
This commit is contained in:
Diogo Cordeiro 2019-04-16 00:43:17 +01:00
parent 38f2ecefac
commit f89c052cf8
3 changed files with 29 additions and 6 deletions

View File

@ -18,8 +18,8 @@ create table status_network (
tags text comment 'site meta-info tags (pipe-separated)',
created datetime not null comment 'date this record was created',
modified timestamp comment 'date this record was modified'
created datetime not null comment 'date this record was created' default now(),
modified timestamp comment 'date this record was modified' default now()
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

View File

@ -1097,6 +1097,10 @@ class DB_mysqli extends DB_common
}
}
public function getVersion() {
return mysqli_get_server_version($this->connection);
}
// }}}
}

View File

@ -271,7 +271,7 @@ class MysqlSchema extends Schema
$engine = $this->preferredEngine($def);
return ") ENGINE=$engine CHARACTER SET utf8mb4 COLLATE utf8mb4_bin";
}
function preferredEngine($def)
{
/* MyISAM is no longer required for fulltext indexes, fortunately
@ -386,7 +386,7 @@ class MysqlSchema extends Schema
$map = array('serial' => 'int',
'integer' => 'int',
'numeric' => 'decimal');
$type = $column['type'];
if (isset($map[$type])) {
$type = $map[$type];
@ -436,13 +436,32 @@ class MysqlSchema extends Schema
*/
function filterDef(array $tableDef)
{
$version = $this->conn->getVersion();
foreach ($tableDef['fields'] as $name => &$col) {
if ($col['type'] == 'serial') {
$col['type'] = 'int';
$col['auto_increment'] = true;
}
if ($col['type'] == 'datetime' && isset($col['default']) && $col['default'] == 'CURRENT_TIMESTAMP') {
$col['type'] = 'timestamp';
// Avoid invalid date errors in MySQL 5.7+
if ($col['type'] == 'timestamp' && !isset($col['default'])
&& $version >= 50605) {
$col['default'] = 'CURRENT_TIMESTAMP';
}
if ($col['type'] == 'datetime') {
// Avoid invalid date errors in MySQL 5.7+
if (!isset($col['default']) && $version >= 50605) {
$col['default'] = 'CURRENT_TIMESTAMP';
}
// If we are using MySQL 5.5, convert datetime to timestamp if
// default value is CURRENT_TIMESTAMP. Not needed for MySQL 5.6+
// and MariaDB 10.0+
if (isset($col['default'])
&& $col['default'] == 'CURRENT_TIMESTAMP'
&& $version < 50605) {
$col['type'] = 'timestamp';
}
}
$col['type'] = $this->mapType($col);
unset($col['size']);