wns9778.com_威尼斯wns.9778官网

热门关键词: wns9778.com,威尼斯wns.9778官网
wns9778.com > 计算机教程 > mysql 日期字段 的异常 Data truncated for column 的处理

原标题:mysql 日期字段 的异常 Data truncated for column 的处理

浏览次数:185 时间:2019-12-12

 

今天在开发库上给一个表添加字段时候,发现居然报错:

mysql 的date类型 的支持范围是1000-01-01到9999-12-31

root@DB 06:14:42>ALTER TABLE `DB`.` user` ADD COLUMN `status_mode` TINYINT UNSIGNED AFTER ` test_id`;

 

ERROR 1292 (22007): Incorrect datetime value: ‘0000-00-00 00:00:00’ for column ‘GMT_CLEANUP’ at row 2;

datetime类型的支持范围是1000-01-01 00:00:00 到9999-12-31 23:59:59

查找error的信息:

 

$perror 1292

如果尝试把超出范围的值插入数据库中,则会报标题中的错误。

错误:1292 SQLSTATE: 22007 (ER_TRUNCATED_WRONG_VALUE)

 

消息:截短了不正确的%s值: ‘%s’

有效的处理方法有两种:

这种解释有点让人不明白。

 

接着想到mysql中alter table add column运行时会对原表进行临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。那么报错的原因就是在ddl过程中copy原表,在copy表的过程中发现有表中GMT_CLEANUP的数据为’0000-00-00 00:00:00’,mysql认为该数据是不合法的数据:

1、程序中检查日期的范围,当超出时给出提示或其他处理

root@DB06:39:56>select GMT_CLEANUP from user where GMT_CLEANUP like ‘\0%’ limit 2

 

-> ;

2、在mysql 安装目录的my.ini 里找到sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_Create_USER,NO_ENGINE_SUBSTITUTION”

———————

 

| GMT_CLEANUP         |

把其中的STRICT_TRANS_TABLES,去掉,然后重启mysql。

———————

 

| 0000-00-00 00:00:00 |

采用第二种方法的时候,当日期超出范围时,插入数据库时不报错,但会是一个0000-00-00 或者0000-00-00 00:00:00

| 0000-00-00 00:00:00 |

 

———————

  摘自 Lwei的博客

2 rows in set, 1 warning (0.00 sec)

http://www.bkjia.com/Mysql/489328.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/489328.htmlTechArticlemysql 的date类型 的支持范围是1000-01-01到9999-12-31 datetime类型的支持范围是1000-01-01 00:00:00 到9999-12-31 23:59:59 如果尝试把超出范围的值插入数据...

第一个问题:那么为什么mysql认为0000-00-00 00:00:00是不正确的?

第二个问题0000-00-00 00:00:00是怎么被插入到数据库中的,应用有这个需求吗?

对于第一个问题,还是需要回到mysql中对日期时间的定义上,在官方文档上说明MySQL允许将’0000-00-00’保存为“伪日期”(如果不使用NO_ZERO_DATE SQL模式)。这在某些情况下比使用NULL值更方便(并且数据和索引占用的空间更小)。那么接下来,就是看看sql_mode中的参数了;

root@DB06:40:48>show variables like ‘sql_mode’;

————— ——————————————————————————————————————————-

| Variable_name | Value                                                                                                                         |

————— ——————————————————————————————————————————-

| sql_mode      | STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER |

————— ——————————————————————————————————————————-

1 row in set (0.00 sec)

参数中含有no_zero_date,

在严格模式,不要将 ‘0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。

NO_ZERO_IN_DATE

在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。

问题可以解决了,改变sql_mode:将no_zero_date和no_zero_in_date去掉:

root@DB 07:05:21>set global sql_mode=’STRICT_TRANS_TABLES,STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER’;

Query OK, 0 rows affected (0.00 sec)

root@DB 07:07:01>show variables like ‘%sql_mode%’;

————— ——————————————————————————————————————————-

| Variable_name | Value                                                                                                                         |

————— ——————————————————————————————————————————-

| sql_mode      | STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER |

————— ——————————————————————————————————————————-

本文由wns9778.com发布于计算机教程,转载请注明出处:mysql 日期字段 的异常 Data truncated for column 的处理

关键词: wns9778.com

上一篇:wns9778.commysql外键关联问题

下一篇:没有了