【问题标题】:What datatype to use in a MySQL-database when inserting comma-seperated int numbers?插入逗号分隔的整数时在 MySQL 数据库中使用什么数据类型?
【发布时间】:2011-12-02 18:14:01
【问题描述】:

我得到了一个一般性且可能很简单的问题。将整数数组保存到 MySQL 数据库(数字用逗号分隔)时,数据库选择的正确数据类型是什么? When choosing INT as type, I guess I may not use commas, may I? 所以我使用“文本”作为数据类型,因为这些数字数组可能会变得很长,而且我不想设置限制。但这是正确的方法还是只在我的数据库的“文本”字段中保存带逗号的数字是不好的?

感谢您的帮助! phpheini

【问题讨论】:

    标签: mysql int


    【解决方案1】:

    最好的数据类型是另一个表。

    在我的数据库的“文本”字段中只保存带逗号的数字确实非常“糟糕”

    这会破坏First Normal Form

    这样做会导致您在修改值时增加字段上的数据争用。

    例如,假设两个用户想要将新值添加到与记录关联的数字列表中。当表处于 1NF 时,通常两个用户都会插入一条记录。当不在 1NF 中时,一个用户很容易丢失添加,因为您将多个值写回单个属性。

    这也使得进行简单类型的查询变得非常困难,例如(哪些记录在列表中有 3)。是的,它可以完成,但它不能使用任何索引,因为数据库不会索引字段内的内容(SQL Server 的 XML 类型等特殊情况除外)

    【讨论】:

    • 那么问题是,想象成百上千的用户向每个人添加 1000 个新的 int 数。最后,在这个包含数十万行的巨大表中搜索来自 id 1 的用户的所有行会比在每个用户 ID 只有一个条目的数据库中搜索要慢吗?
    • 没有。只要您在 FK 上有索引,它就会变慢。因为你打算用逗号列表做什么?您可以检索它然后将其拆分(字符串解析很昂贵),或者更糟糕的是,您需要在其上放置一个WHERE 子句,如前所述,它会很慢,因为它不能是 SARGAable。但不要相信我的话,你自己试试吧。
    • 好的,因为现在我也想知道如何将数字插入数据库。假设用户要插入 1000 个数字,那么 foreach 循环会 1000 次调用 mysql INSERT 算法,而另一种方法会一次插入所有数字。
    • 你知道如何使用准备好的语句来做到这一点吗?
    【解决方案2】:

    最好的办法是不要将逗号分隔的列表插入到单个列中。

    它迟早会回来咬你。

    我建议你阅读规范化。

    【讨论】:

      【解决方案3】:

      序列化数组而不是将其存储到数据库中,当访问未意识到这一点时,您可以将其用作 varchar/longtext,因为数据类型取决于您的数组有多少数据。 您将在下面的示例中看到不同之处。

      $var  = array('1'=>'a','2'=>'b');
      $var2  = serialize($var);
      echo $var2;
      print_r(unserialize($var2));
      

      【讨论】:

        【解决方案4】:

        您需要将它们保存在单独的行中。在数据库中保存逗号分隔的数据会破坏第一范式。

        【讨论】:

          【解决方案5】:

          文本是我的建议,但需要注意的是,它不容易被该值列表中的特定值搜索或索引。

          在不知道这些值是什么以及它们的用途的情况下,我无法提出任何其他建议,但您可能需要考虑数据库规范化。从长远来看,它会好得多。

          【讨论】:

            猜你喜欢
            • 2016-05-31
            • 2014-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多