我们使用phpmyadmin数据库来存储我们的用户数据。有一个名为'gold'的列,它是int(11)。所以当用户最大化他们的gold时,它变成了负数。所以我想把列类型改为float或varchar。如果我这样修改它,我们的用户数据会发生什么?
我还没有试着去改变它,因为它可能会破坏我们的用户数据。即使我有一个备份,我不敢尝试它。
nzrxty8p1#
在MySQL中,整数不会溢出为负值。如果你试图存储一个太大而无法放入数据类型的整数,如果你设置了严格模式(这是默认设置),它将返回一个错误。
mysql> create table mytable (n int); Query OK, 0 rows affected (0.01 sec) mysql> insert into mytable set n = 4000000000; ERROR 1264 (22003): Out of range value for column 'n' at row 1
如果禁用strict模式,MySQL仍然不会返回负数。它会将值截断为适合有符号整数的最大值。我更喜欢使用strict模式,因为非strict行为没有太多好的用途。
mysql> set sql_mode=''; Query OK, 0 rows affected (0.00 sec) mysql> insert into mytable set n = 4000000000; Query OK, 1 row affected, 1 warning (0.00 sec) mysql> show warnings; +---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1264 | Out of range value for column 'n' at row 1 | +---------+------+--------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from mytable; +------------+ | n | +------------+ | 2147483647 | +------------+
(That number为231-1,这是有符号32位整数类型的最大值。)如果可以将一种类型转换为另一种类型,则可以更改表以更改数据类型。例如,将INT转换为BIGINT很容易,因为BIGINT包含INT中的每个值。将INT转换为VARCHAR也是可能的,不会丢失数据。将INT转换为FLOAT可能无法给予您的需要,因为有些值会变成近似值。将BIGINT转换为INT可能会导致问题,因为大值不适合INT,这些值可能会被截断或导致错误。其他人提出了很好的建议:请自行测试。除非你已在暂存数据上尝试过,否则不要对重要数据作任何更改,除非你已了解它的运作方式及是否有任何限制。这个一般建议适用于许多类型的程式设计工作。不要首次对最重要及在出错时难以还原的数据使用任何功能或操作。为安全起见,您可能希望选择增量方法:1.添加具有要使用的数据类型的新列
mkshixfv2#
我觉得你有几个选择。1.创建一个“虚拟”表,然后简单地在该表上尝试,看看会发生什么。1.这个post表明,简单地改变类型将迫使MySQL将int转换为float,但是这种转换是有损耗的,并且一些32位整数值不能在不损失精度的情况下用32位float表示。一个用户期望获得多少黄金?在我看来,你可能只想使用一个64位整数(BIGINT类型),它可以表示所有大于(或略大于)10^19的整数。
2条答案
按热度按时间nzrxty8p1#
在MySQL中,整数不会溢出为负值。如果你试图存储一个太大而无法放入数据类型的整数,如果你设置了严格模式(这是默认设置),它将返回一个错误。
如果禁用strict模式,MySQL仍然不会返回负数。它会将值截断为适合有符号整数的最大值。我更喜欢使用strict模式,因为非strict行为没有太多好的用途。
(That number为231-1,这是有符号32位整数类型的最大值。)
如果可以将一种类型转换为另一种类型,则可以更改表以更改数据类型。例如,将INT转换为BIGINT很容易,因为BIGINT包含INT中的每个值。将INT转换为VARCHAR也是可能的,不会丢失数据。
将INT转换为FLOAT可能无法给予您的需要,因为有些值会变成近似值。
将BIGINT转换为INT可能会导致问题,因为大值不适合INT,这些值可能会被截断或导致错误。
其他人提出了很好的建议:请自行测试。除非你已在暂存数据上尝试过,否则不要对重要数据作任何更改,除非你已了解它的运作方式及是否有任何限制。这个一般建议适用于许多类型的程式设计工作。不要首次对最重要及在出错时难以还原的数据使用任何功能或操作。
为安全起见,您可能希望选择增量方法:
1.添加具有要使用的数据类型的新列
1.检查结果,以确保所有行上的结果都与预期一致。
1.删除旧列,然后将新列重命名为与旧列相同的名称。
mkshixfv2#
我觉得你有几个选择。
1.创建一个“虚拟”表,然后简单地在该表上尝试,看看会发生什么。
1.这个post表明,简单地改变类型将迫使MySQL将int转换为float,但是这种转换是有损耗的,并且一些32位整数值不能在不损失精度的情况下用32位float表示。
一个用户期望获得多少黄金?在我看来,你可能只想使用一个64位整数(BIGINT类型),它可以表示所有大于(或略大于)10^19的整数。