MySQL奇怪的插入错误

时间:2009-11-10 19:36:17

标签: mysql

将数据插入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),但即使我遇到同样的问题。

我不确定这里出了什么问题,所以如果有人可以就此问题分享一些见解,我们将非常感激。

感谢。

5 个答案:

答案 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来增加范围。