我的桌子上有一些无效的日期.我听说我可以禁用严格模式或使用无效的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 |
Run Code Online (Sandbox Code Playgroud)
看起来您的错误消息来自您的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')
Run Code Online (Sandbox Code Playgroud)
试着从结果集中找出哪些日期是垃圾.它们可以放在这个选择语句中的第一位,但是你将不得不在一点点找到它们.
接下来,弄清楚如何修复它们.删除行?将日期更改为1941-12-07(生活在臭名昭着的日期)?我们无法告诉您这里需要做什么.
然后,修复它们.如果只有一个或两个,请逐个修复它们.
UPDATE mytable
SET datecol='whatever replacement date'
WHERE id='the id of the offending row.'
Run Code Online (Sandbox Code Playgroud)
要么
DELETE FROM mytable
WHERE id='the id of the offending row.'
Run Code Online (Sandbox Code Playgroud)
如果有成千上万的,你可以用这样的东西批量修复它们.但如果没有在测试服务器上仔细解决问题,请不要这样做.如果你犯了错误,你会把你的桌子丢弃.
UPDATE mytable
SET datecol='whatever replacement date'
WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)
在你完成纠正问题之后,回去做你的SELECT *,确保你得到它们.
然后禁用ALLOW_INVALID_DATES,永远不要再次重新启用它.
那应该清理乱七八糟的东西.请注意,真实世界的数据总是有些行不完美.
| 归档时间: |
|
| 查看次数: |
4750 次 |
| 最近记录: |