【问题标题】:"Warning: Out of range value for column" inserting a datetime value into MySQL“警告:列的值超出范围”将日期时间值插入 MySQL
【发布时间】:2012-06-12 20:52:01
【问题描述】:

使用 Python 和 Mysqldb 库从 MongoDB 中提取一些数据并将其插入 MySQL 数据库。

+-------------------+------------+------+-----+---------+----------------+
| Field             | Type       | Null | Key | Default | Extra          |
+-------------------+------------+------+-----+---------+----------------+
| id                | int(16)    | NO   | PRI | NULL    | auto_increment |
| subject           | tinytext   | NO   |     | NULL    |                |
| created_at        | datetime   | NO   |     | NULL    |                |
+-------------------+------------+------+-----+---------+----------------+

created_at  = "2012/06/08 11:47:40 -0700"
sql1 = ("INSERT INTO `items` (`description`, `created_at`) VALUES (%s, %s)", (description, created_at)
try:
    cursor.execute(*sql1)
except MySQLdb.Error, e:
    print "Error %s: %s" % (e.args[0], e.args[1])

对于第一次插入数据库,我收到了警告,但是我没有收到后续插入的警告。

conf/db_tools-import.py:53:警告:第 1 行的列“created_at”的值超出范围 cursor.execute(*sql1)

我该如何解决这个问题? 谢谢。

【问题讨论】:

  • 我认为 MySQL 不支持 datetime 的小时偏移量。
  • 这不是正确的 DATETIME 值。格式为YYYY-MM-DD HH:MM:SS。根本不支持时区
  • 酷,谢谢。还有一个问题,为什么我没有收到后续插入的警告以及插入是如何起作用的?
  • 我不知道为什么您没有收到后续操作的警告,但是插入成功了,因为 mySQL 尽可能地将字符串转换为 DATETIME(甚至可能导致正确的日期)。这只是一个警告 - 但您也可以将服务器配置为抛出错误(“严格模式”)

标签: python mysql mysql-python


【解决方案1】:

您收到警告是因为您在日期字段中插入了一个长日期。提交的日期是“YYYY-MM-DD”(http://dev.mysql.com/doc/refman/5.1/en/datetime.html)。

我在Mysql中做了自己的测试,看看:

mysql> create table bigtable (created_at date);
Query OK, 0 rows affected (0.07 sec)

mysql> 

Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1265 | Data truncated for column 'created_at' at row 1 |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from bigtable;
+------------+
| created_at |
+------------+
| 2012-06-08 |
+------------+
1 row in set (0.00 sec)

如果您想避免警告,只需传递“YYYY-MM-DD”或将列更改为日期时间,

祝你好运

【讨论】:

  • 为什么这是公认的答案?我可以在问题中看到该列已经是 DATETIME ...
  • @DerekLitz 问题不在于日期时间,他试图插入完整的时间并且值被截断并产生衰减
  • 我遇到了同样的问题。将列类型从 TIMESTAMP 更改为 DATETIME 修复了超出范围的错误。
猜你喜欢
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
相关资源
最近更新 更多