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;
`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 |
+----+----------+------------+----------+--------+
| 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 |
+---------+------+-----------------------------------------------------------+
+---------+------+-----------------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------------+
| Warning | 1264 | Data truncated; out of range for column 'con_id' at row 1 |
+---------+------+-----------------------------------------------------------+
问题就是 tinyint(3),这种类型的值范围是-128到127,我们操作的时候值超出了其范围,把tinyint(3)改为mediumint(8)就没问题了。而且我的数据库设置这种情况不报错,所以……折腾了好几天。
meiking
2008-09-25 13:21:22
评论:2
阅读:46
引用:0
无题
@2008-09-26 18:27:54 meiking
恩,有道理。我问了下人家问什么这么设计,人家还真说是为了节省空间…
无题
@2008-09-25 18:13:39 hofman
真是小气,int,bigint就拉倒了。也浪费不了几MB存储空间,现在的硬盘真是超便宜了。
