mysql 如何将列的类型从int改为float?

v7pvogib  于 2023-01-08  发布在  Mysql
关注(0)|答案(2)|浏览(712)

我们使用phpmyadmin数据库来存储我们的用户数据。有一个名为'gold'的列,它是int(11)。所以当用户最大化他们的gold时,它变成了负数。所以我想把列类型改为float或varchar。如果我这样修改它,我们的用户数据会发生什么?

我还没有试着去改变它,因为它可能会破坏我们的用户数据。即使我有一个备份,我不敢尝试它。

nzrxty8p

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.添加具有要使用的数据类型的新列

  1. UPDATE all row将值从旧列复制到新列,从而允许进行类型转换。
    1.检查结果,以确保所有行上的结果都与预期一致。
    1.删除旧列,然后将新列重命名为与旧列相同的名称。
mkshixfv

mkshixfv2#

我觉得你有几个选择。
1.创建一个“虚拟”表,然后简单地在该表上尝试,看看会发生什么。
1.这个post表明,简单地改变类型将迫使MySQL将int转换为float,但是这种转换是有损耗的,并且一些32位整数值不能在不损失精度的情况下用32位float表示。
一个用户期望获得多少黄金?在我看来,你可能只想使用一个64位整数(BIGINT类型),它可以表示所有大于(或略大于)10^19的整数。

相关问题