在MYSQL中使用int(11)数据类型时遇到的问题

18 浏览
0 Comments

在MYSQL中使用int(11)数据类型时遇到的问题

我在MYSQL中有一个表,其中有一个主键id int(11)(自动递增)。现在我有一个程序,它读取一些文本文件并将值输入到id列中。

所以我的表应该包含:

id
897413
791783

但是实际情况是,我在表中找不到大数。这是因为int(11)能够容纳的最大值吗?将int(11)增加到int(20)仍然面临同样的问题。我不能将数据类型更改为bigint,因为我已经实现了很多代码。

编辑:

我尝试插入一个id为523826的单个记录,它在数据库中保存为450258。为什么会这样?

0
0 Comments

问题的出现原因是:int(11)数据类型在MySQL中只是用来显示宽度,对实际存储的数值没有影响。无论将int的显示宽度设置为多少,它的存储范围仍然是-2147483648到2147483647(有符号)或0到4294967295(无符号)。因此,无论将int的显示宽度设置为11还是20,都无法存储超出这个范围的值。

问题的解决方法是:不能仅通过增加int的显示宽度来扩大其存储范围。如果需要存储超出int的范围的值,可以考虑使用其他数据类型,如bigint。bigint可以存储更大的整数值,其有符号范围为-9223372036854775808到9223372036854775807,无符号范围为0到18446744073709551615。

以下是对话中的具体内容,包括问题的出现和解决方法:

定义了MySQL手册中int数据类型的说明:

int是常规大小的整数类型。有符号范围为-2147483648到2147483647,无符号范围为0到4294967295。

int类型始终是4字节(32位)。int(11)中的11只是“显示宽度”,只对UNSIGNED ZEROFILL列有影响。关于此问题的更多详情,请参考此博客文章。

尝试插入一个id=523826的记录,但实际插入的是450258。为什么会这样?同时,我已经将大小增加到int(20)。

你能贴出INSERT查询吗?

你不能仅通过增加INT的大小到20来扩大其范围。整数列括号中的数字只用于填充值为零的情况,它将填充到指定的字符数。否则,它对可以插入的值没有任何控制。INT永远无法存储超出+/-2147483648或4294967295(无符号)范围之外的值。

0
0 Comments

问题的原因是MySQL中的INT数据类型只有32位,INT(11)表示有符号的INT,对于ID来说是无用的。将其改为无符号的INT将自动将可用的ID数量增加一倍。即使11“看起来”更大,是因为它考虑了数字的“长度”,如果是最大的负数(-2147483648),长度为11个字符。

解决方法是使用BIGINT数据类型,它可以使用64位,可以是有符号或无符号。再次强调,使用无符号将允许使用两倍数量的ID(>0)。

正如上面提到的,如果您的PHP不支持64位整数,那么您将无法轻松地使用它们。

希望对您有所帮助。

我正在使用java,java Integer可以保存523826。当我将其插入数据库时出现问题。

请提供您正在使用的SQL以及表结构。

0