mysql修复无效日期

时间:2012-10-17 11:12:59

标签: mysql

我的桌子上有一些无效日期。我听说我可以禁用严格模式或使用不起作用的sql_mode ALLOW_INVALID_DATES(已通过select @@ global.sql_mode和重新启动的服务器确认)。

我的问题是,我可以解决这些“无效”日期吗?我无法在每台服务器上禁用严格模式。

select * from table
>> Mysql2::Error: Invalid date: 1900-00-00

mysql --version
mysql  Ver 14.14 Distrib 5.1.61, for debian-linux-gnu (i686) using readline 6.1

mysql> select @@global.sql_mode;
+---------------------+
| @@global.sql_mode   |
+---------------------+
| ALLOW_INVALID_DATES |

1 个答案:

答案 0 :(得分:5)

看起来您的错误消息来自您的MySQL客户端,而不是服务器。因此,设置服务器严格模式不会帮助您使用此客户端显示这些日期。

您的数据似乎有一些2012-09-31或2013-02-29样式日期。它们格式正确,但其他方面都是错误的。在5.0的5.0.2版本中,这些版本没有被正确捕获到您的数据中。现在,设置为ALLOW_INVALID_DATES的服务器并没有呕吐,而是将它们转换为'0000-00-00'。客户正在嘲笑他们。

清理它的第一步是识别有问题的行。你可以试试这个。

首先,启用ALLOW_INVALID_DATES

然后,运行此查询以在表格中查看。请勿使用SELECT *

  SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d') 
    FROM mytable
   ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d') 

尝试从结果集中找出哪些日期是垃圾。它们可能会在这个选择语句中排在第一位,但是你需要稍微捣乱才能找到它们。

接下来,弄清楚如何修复它们。删除行?将日期更改为1941-12-07(生活在臭名昭着的日期)?我们无法告诉您这里需要做什么。

然后,修复它们。如果只有一个或两个,请逐个修复。

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE id='the id of the offending row.'

  DELETE FROM mytable
        WHERE id='the id of the offending row.'

如果有数千个,你可以用这样的东西批量修复它们。 但如果没有在测试服务器上仔细解决问题,请不要这样做。如果你犯了错误,你会把你的桌子丢弃。

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')

在您完成问题的纠正后,请返回并执行SELECT *,以确保全部解决问题。

然后停用ALLOW_INVALID_DATES,再也不要重新启用它。

那应该清理乱七八糟的东西。请注意,真实世界的数据总是有些行不完美。