将不正确的整数(2147483647)插入到 MySQL 中?

Posted

技术标签:

【中文标题】将不正确的整数(2147483647)插入到 MySQL 中?【英文标题】:Incorrect Integer (2147483647) is inserted into MySQL? 【发布时间】:2012-05-02 14:23:20 【问题描述】:

好的,所以我一直在玩弄 Steam Web API,我将其中一个值存储在一个名为 $steam64 的变量中。当我使用此代码剪辑器将其插入 mysql 数据库时,它会插入一个与变量中存储的完全不同的整数。

$sql_query = "INSERT INTO users_info (steam64) VALUES ('$steam64')";

var_dump($steam64); 返回真正的 int,回显它也是如此。不太清楚这里发生了什么,感谢任何帮助。

【问题讨论】:

插入了什么(以及转储了什么)以及的列类型是什么?这可能不是 MySQL 中的“错误”,这意味着问题出在其他地方...... 整数上不需要单引号。它可能会尝试将字符串 '$steam64' 作为整数插入,并在此过程中进行转换。 @pst 2147483647 正在插入,76561197989628470 正在转储,列类型为 int(255)。 @Lazerblade 只是拥有它VALUES ($steam64) 仍然会插入错误的 int。 dev.mysql.com/doc/refman/5.5/en/integer-types.html 【参考方案1】:

基于您对“价值被倾销”的评论;您尝试插入的数字对于 32 位系统来说太大了。 32 位的最大值为 4,294,967,295,64 位的最大值为 18,446,744,073,709,551,615。我建议将您的列转换为 varchar(100) 哈希而不是 int,或者切换到 64 位系统。 很棒的文章关于最大整数 here 和 here。


另外,在我被激怒之前,请务必阅读SQL injection,以防您不清理直接发布到 sql 语句中的变量。

【讨论】:

已发布更新。您尝试插入的数字太大。 谢谢 :) 是 php 还是 MySQL 有限制? 这是一个系统限制,因此任何试图访问这么大数字的应用都会导致意外行为。 好吧,快速提问,如果我想要一个带有类似于 76561197980000000 的变量的 for 循环,这可能吗? 可以,只要不是 int。【参考方案2】:

只需将数据类型从 INT 更改为 BIGINT

【讨论】:

【参考方案3】:

数据类型 INT 的最大值是 2147483647。如果您插入的数字大于 2147483647,则会导致问题。 对于解决方案,将数据类型从 INT 更改为 BIGINT,因为 BIGINT 的最大值为 9223372036854775807,它可能会解决您的问题。 看看这个网站: https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

【讨论】:

【参考方案4】:

同意将数据类型从 INTEGER 更改为 BIGINT。目前正在使用 node.js/sequelize 构建一个 Web 应用程序,以下重构解决了从 react-redux 表单操作到“2147483647”的电话号码帖子:

clientPhone: 
    type: DataTypes.BIGINT,
    allowNull: true
,

【讨论】:

【参考方案5】:

当我在玩 SQL 时,MySQL 遇到了同样的问题 MySQL int 数据类型。 将数据类型从 int 修改为 bigint 已修复问题。

MySQL Integer Types http://dev.mysql.com/doc/refman/5.7/en/integer-types.html

ALTER TABLE tablename MODIFY columnname BIGINT; 

【讨论】:

【参考方案6】:

最简单的方法是将 MySQL 的“int”更改为“varchar”。

【讨论】:

不要这样做。永远不要这样做。 VARCHAR 是一种字符串表示形式,而不是数字表示形式。不可能对字符串进行数学运算。【参考方案7】:

整数类型INT是4Bytes存储,你从-2^(4*8-1)=-21474836482^(4*8-1)-1=2147483647,当你有“signed”标志时,如果你把标志改为未签名您将拥有从 02^(4*8)-1 的范围。 MySQL 支持 BIGINT 为 8Bytes 存储。如果您尝试保存更大的值,您将保存范围的最大值

【讨论】:

【参考方案8】:

转到操作-> 表选项-> 将增量值更改为最小值或您想要增量的任何值..

自动增量的大问题是如果它的值非常大,则错误地从最后一个条目开始,然后在插入值中开始问题......使用我们预定义的数据类型

【讨论】:

【参考方案9】:
CREATE TABLE `dvouchers` (
  `2147483647` int(3) NOT NULL auto_increment,
  `code` varchar(12) NOT NULL default '1',
  `type` char(1) NOT NULL default '$',
  `count` int(3) unsigned NOT NULL default '0',
  `amount` int(3) unsigned default '0',
  `notes` text,
  `expiryDate` date default NULL,
  `fkUserAdminId` int(11) NOT NULL default '0',
  PRIMARY KEY  (`2147483647`),
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

【讨论】:

hmm ... 这回答了这个问题,因为 ... ? 这毫无意义,如果您遇到此问题,请不要试图从这个答案中推断出任何帮助。【参考方案10】:

2147483647 是 mysql 的最大 int 值。只需将类型从 int 更改为 bigint。

【讨论】:

值得注意的是,BIGINT 的限制为 -9223372036854775808 到 9223372036854775807(有符号)或 0 到 18446744073709551615(无符号)。如果您想要最大的 POSITIVE ONLY 整数,请使用 COLUMNNAME BIGINT(32) UNSIGNED DEFAULT 0

以上是关于将不正确的整数(2147483647)插入到 MySQL 中?的主要内容,如果未能解决你的问题,请参考以下文章

网站 web.config > 是不是可以将不正确的子域重定向到某个页面?

运行时错误:有符号整数溢出:2147483647 + 1 不能以“int”类型表示

将不存在的记录插入Mysql表

如果使用Arrays Stream的整数数组的总和超过int max value(2147483647),如何处理?

mysql中int与int(10)的区别

PHP: intval() 等价于数字 >= 2147483647