JAVA连接MySQL数据库,在操作值为0的timestamp类型时不能正确的处理,而是默认抛出一个异常,就是所见的:java.sql.SQLException: Cannot convert value ‘0000-00-00 00:00:00’ from column 7 to TIMESTAMP。
这类异常的触发与timestamp赋值的操作有关,如果能够在设计阶段和记录写入阶段做好逻辑判断,避免写入 ‘0000-00-00 00:00:00’这类值,那么也可以避免出现 Cannot convert value ‘0000-00-00 00:00:00’ from column N to TIMESTAMP的错误。
mysql> create database db100; Query OK, 1 row affected (0.01 sec) mysql> create table booboo1 (id int,t1 timestamp not null default '0000-00-00 00:00:00'); ERROR 1067 (42000): Invalid default value for 't1'
重新以可用的默认时间戳值声明列,创建测试表booboo1。
mysql> create table booboo1 (id int,t1 timestamp not null default current_timestamp); Query OK, 0 rows affected (0.04 sec) mysql> desc booboo1; +-------+-----------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-------+ | id | int(11) | YES | | NULL | | | t1 | timestamp | NO | | CURRENT_TIMESTAMP | | +-------+-----------+------+-----+-------------------+-------+ 2 rows in set (0.00 sec) mysql> insert into booboo1 setid=1; Query OK, 1 row affected (0.01 sec) mysql> insert into booboo1 setid=2; Query OK, 1 row affected (0.00 sec) mysql> select * from booboo1; +------+---------------------+ | id | t1 | +------+---------------------+ | 1 | 2017-06-30 10:16:43 | | 2 | 2017-06-30 10:16:46 | +------+---------------------+ 2 rows in set (0.00 sec)
设置sql_mode跳过sql错误后,再去创建测试表t1,声明列time timestamp not null default ‘0000-00-00 00:00:00’),显示成功。
mysql> set @@sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected (0.00 sec) mysql> select @@sql_mode; +--------------------------------------------+ | @@sql_mode | +--------------------------------------------+ | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+ 1 row in set (0.00 sec) mysql> use db100; Database changed mysql> create table t1 (id int,time timestamp not null default '0000-00-00 00:00:00'); Query OK, 0 rows affected (0.05 sec) mysql> insert into t1 setid=1; Query OK, 1 row affected (0.01 sec) mysql> select * from t1; +------+---------------------+ | id | time | +------+---------------------+ | 1 | 0000-00-00 00:00:00 | +------+---------------------+ 1 row in set (0.00 sec)
故障总结
这类异常的触发与timestamp赋值的操作有关,如果能够在设计阶段和记录写入阶段做好逻辑判断,避免写入 ‘0000-00-00 00:00:00’这类值,那么也可以避免出现 Cannot convert value ‘0000-00-00 00:00:00’ from column N to TIMESTAMP的错误。