Out of range value for Integer column type does not truncate to it's maximum value if there are more than 19 digits. In the following example, there should not be -1 value in the second row. Is it a bug?
drop table if exists test;
CREATE TABLE `test` (
`col1` int(11) NOT NULL,
`col2` int(11) NOT NULL,
`col3` int(11) NOT NULL,
`col4` int(11) NOT NULL,
`col5` int(11) NOT NULL,
`col6` int(11) NOT NULL,
`col7` int(11) NOT NULL,
`col8` int(11) NOT NULL,
`lastupdate` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`lastupdateid` varchar(100) NOT NULL
) ENGINE=InnoDB;
insert into test values('6022','2123456789012345678', '00','00','00','00','00','00', NULL, 'test');
mysql>select * from test;
+------+------------+------+------+------+------+------+------+---------------------+--------------+
| col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 | lastupdate | lastupdateid |
+------+------------+------+------+------+------+------+------+---------------------+--------------+
| 6022 | 2147483647 | 0 | 0 | 0 | 0 | 0 | 0 | 2009-10-28 18:20:30 | test |
+------+------------+------+------+------+------+------+------+---------------------+--------------+
1 row in set (0.00 sec)
insert into test values('6022','21234567890123456789', '00','00','00','00','00','00', NULL, 'test');
mysql>select * from test;
+------+------------+------+------+------+------+------+------+---------------------+--------------+
| col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 | lastupdate | lastupdateid |
+------+------------+------+------+------+------+------+------+---------------------+--------------+
| 6022 | 2147483647 | 0 | 0 | 0 | 0 | 0 | 0开发者_开发技巧 | 2009-10-28 18:20:30 | test |
| 6022 | -1 | 0 | 0 | 0 | 0 | 0 | 0 | 2009-10-28 18:20:34 | test |
+------+------------+------+------+------+------+------+------+---------------------+--------------+
2 rows in set (0.00 sec)
It's not a bug, it's merely a case of integer overflow.
If you need your number-in-string value to max out, you should add code to do that, either when you do the insert, or as a trigger.
See http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html for more information.
You can also experiment with small selects (untested, I don't have MySQL access here):
SELECT CAST('2123456789012345678' AS INT(11))
SELECT CAST('21234567890123456789' AS INT(11))
精彩评论