mysql Warning: #1264

公司一同事在给客户实现以个小功能的时候出现了问题,问题是这样的:插入一个整形数字到表中,无论怎么修改sql语句,数值最终入库的时候都是127。最后他是在搞不定了,于是问题就落在我头上了,这个问题我也研究了两天,最后才发现是基本功不扎实的原因,白白浪费了两天时间。

这是数据结构:

CREATE TABLE IF NOT EXISTS `mall_goods_article` (
  `goods_id` mediumint(8) unsigned NOT NULL default '0',
  `id` mediumint(8) NOT NULL auto_increment,
  `article_id` mediumint(8) unsigned NOT NULL default '0',
  `admin_id` tinyint(3) unsigned NOT NULL default '0',
  `con_id` tinyint(3) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `article_id` (`article_id`,`admin_id`,`con_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

数据:

+----+----------+------------+----------+--------+
| id | goods_id | article_id | admin_id | con_id |
+----+----------+------------+----------+--------+
|  1 |       12 |        289 |        1 |    127 |
+----+----------+------------+----------+--------+

执行的sql语句:

UPDATE `nangua`.`mall_goods_article` SET `con_id` = '128' WHERE `mall_goods_article`.`id` =1 LIMIT 1 ;

无论怎么执行结果都没有变化。。。

估计数据库高手们已经能看出问题出在什么地方了,接着执行以下语句问题就找到了。一开始我还拼命的检查sql语句和链接数据库的插件,甚至去查找mysql的bug list……

mysql> show warnings;
+---------+------+-----------------------------------------------------------+
| Level   | Code | Message                                                   |
+---------+------+-----------------------------------------------------------+
| Warning | 1264 | Data truncated; out of range for column 'con_id' at row 1 |
+---------+------+-----------------------------------------------------------+

问题就是 tinyint(3),这种类型的值范围是-128127,我们操作的时候值超出了其范围,把tinyint(3)改为mediumint(8)就没问题了。而且我的数据库设置这种情况不报错,所以……折腾了好几天。


class="syntax">

meiking   2008-09-25 13:21:22 评论:2   阅读:36   引用:0
无题 @2008-09-26 18:27:54  meiking
恩,有道理。我问了下人家问什么这么设计,人家还真说是为了节省空间…
无题 @2008-09-25 18:13:39  hofman
真是小气,int,bigint就拉倒了。也浪费不了几MB存储空间,现在的硬盘真是超便宜了。

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2008 powered by YuLog