将数据插入mysql表列时出现奇怪的错误。
详细说明:
创建表语句:
CREATE TABLE `product_offer_line` (
`object_id` int(19) NOT NULL default '0',
`snapshot_id` int(19) NOT NULL default '0',
`domain` varchar(255) NOT NULL,
`description` varchar(255) default NULL,
`name` varchar(255) NOT NULL,
`priority` int(10) default NULL,
`parent_offer_line` varchar(255) default NULL,
PRIMARY KEY (`object_id`,`snapshot_id`,`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
请注意object_id as int(19)
,我的插入语句为("INSERT INTO product_offer_line VALUES('1000000000001','1','NL','Radio and TV','TV','0','NULL')");
现在我运行此插入而不是
select * from product_offer_line;
+------------+-------------+--------+-----------------------+------+----------+-------------------+
| object_id | snapshot_id | domain | description | name | priority | parent_offer_line |
+------------+-------------+--------+-----------------------+------+----------+-------------------+
| 2147483647 | 1 | NL | Standard radio and TV | CATV | 0 | NULL |
+------------+-------------+--------+-----------------------+------+----------+-------------------+
我的问题是,即使我输入1000000000001
,为什么选择语句会显示2147483647
?
我已尝试将object_id创建为int(64),但即使我遇到同样的问题。
我不确定这里出了什么问题,所以如果有人可以就此问题分享一些见解,我们将非常感激。
感谢。
答案 0 :(得分:3)
mysql int数据类型只能存储最多4294967295(无符号)的数字。如果您尝试存储大于该数字的数字,例如1000000000001,则mysql会将其存储为可能的最大数量(如果列已签名,则为2147483647)。将列更改为bigint数据类型,您应该很高兴。
答案 1 :(得分:2)
1000000000001超出INT
的范围。您需要改为使用BIGINT
。
数字括号与其显示方式有关,而与存储大小无关。
答案 2 :(得分:1)
对于没有任何列的有效范围的值,MySQL非常宽松。在您的情况下,您超出了INT列的值范围。对于INT(64)列,这并不意味着您可以存储最多64位数的实际数字,但只有MySQL应该以该长度显示它们。
您必须将列定义为BIGINT或VARCHAR,具体取决于INSERT中的引用是否是故意的。例如,如果您必须存储带有前导零的数字,则VARCHAR可能是更好的选择。
您可以控制MySQL是否以无提示方式将无效值转换为它可以容纳的最接近的匹配,或者是否因错误而失败。您可以使用SQL Server模式对此进行一些详细控制。请参阅此MySQL 5.0 manual page了解可能的值以及它们如何影响MySQL的行为。
对于您的特定情况,您应该查看STRICT模式,这些模式指定特别是在无效值上会发生什么。
答案 3 :(得分:0)
我使用mysql已经有一段时间了,但这是因为你引用了你的号码吗?
答案 4 :(得分:0)
使用BIGINT
而不是INT(64)
(ref)。如果您的号码保证为正数,您也可以通过声明字段UNSIGNED
来增加范围。