【问题标题】:Changing from tinyint to smallint with a database full of data使用充满数据的数据库从 tinyint 更改为 smallint
【发布时间】:2025-11-25 05:00:01
【问题描述】:

真的是一个安心的问题。

我的数据库中有一个字段使用tinyint(3) 作为整数值。我现在意识到这是一个低值并想将其更改为smallint。如果我使用 phpMyAdmin 更改此设置,是否会影响任何当前数据?我在本地尝试过,看起来不错,但我更喜欢由具有更多数据库经验的人运行它。

【问题讨论】:

    标签: mysql sql database tinyint


    【解决方案1】:

    您的数据在某种程度上受到影响——它将从tinyint 更改为smallint,因此实际上整个列将经历CAST 操作。但它不会受到任何截断或数据丢失的影响。

    因为tinyintsmallint 的子集,所以这个转换操作应该不会导致任何问题。如果您尝试在查询中将 tinyint 值强制转换为 smallint,您永远不会想到会失败,因为每个 tinyint 也是 smallint。修改表架构时也适用相同的逻辑。

    【讨论】:

    • 这对我来说已经足够了。谢谢你们的帮助,抱歉,我无法将它们都标记为正确。
    • 我严重怀疑 phpmyadmin 是否会做必要的 ALTER 表。
    【解决方案2】:

    您可以使用以下查询:

    mysql> ALTER TABLE TableName MODIFY Id SMALLINT
    

    还要确保列是否附加了任何约束,然后您需要先删除这些约束。

    【讨论】:

    • 感谢您的回复。我不确定是什么限制,但我没有手动设置任何限制。我的表格非常简单,其中一个字段(称为“分数”)保存分数。这最初设置为 tinyint(3),但事实证明这还不够大。我只是在 phpmyadmin 中更改了它,但这应该没问题吧?
    • 执行SHOW CREATE TABLE 以查看它当前对 Id 的描述。示例:NOT NULL, AUTO_INCREMENT, ... -- 这些需要在 ALTER 中重复,否则会丢失。