代码之家  ›  专栏  ›  技术社区  ›  Wartin

如何在MySQL数据库中存储布尔值数组?

  •  3
  • Wartin  · 技术社区  · 16 年前

    在我的例子中,每个“项目”要么都有一个属性,要么没有。属性可以是几百个,所以我需要,比如说,每个项目最多1000个真/假位。

    是否有方法将这些位存储在项目的一个字段中?

    4 回复  |  直到 8 年前
        1
  •  3
  •   James Harr    16 年前

    如果您正在寻找一种可以搜索的方法来完成这项工作,那么就不要。

    几个可搜索的方法(涉及1个以上的列和/或表):

    • 用一束 SET 柱。在一个集合中,您被限制在64个项目(开/关),但是您CNA可能会想出一种方法来对它们进行分组。
    • 使用3个表:items(id,…)、flag name(id,name)和pivot table itemflags(item_id,flag_id)。然后可以查询具有 joins .

    如果您不需要它来进行搜索,那么您所需要的就是在将数据放入数据库之前对其进行序列化的方法,以及在将数据拉出时对其进行非序列化的方法,然后使用char或varchar列。

    • 使用内置于您的语言的工具(PHP的序列化/非序列化)。
    • 将一系列“y”和“n”字符连接在一起。
    • 在调用MySQL数据库之前,请将您的值打包到客户机中的字符串(每个字符8位)中,并在从数据库中检索数据时将其解包。这是最有效的存储机制(如果所有行都相同,请使用char[x],而不是varchar[x]),代价是数据不可搜索,代码稍微复杂一些。
        2
  •  3
  •   Francisco Soto    16 年前

    我更喜欢这样的东西:

    Properties
    ID, Property
    1, FirsProperty
    2, SecondProperty
    
    ItemProperties
    ID, Property, Item
    1021, 1, 10
    1022, 2, 10
    

    然后,通过对任何特定项的查询,可以很容易地检索设置了哪些属性。

        3
  •  0
  •   zebediah49    16 年前

    最坏情况下,你必须使用字符(1000)或类似的字符。如果您愿意将其打包(例如,打包成十六进制并不太糟糕),可以使用char(64)[十六进制字符]。

    如果小于64,那么集合类型就可以工作,但这似乎还不够。

    您可以使用二进制类型,但它更多地是为电影等东西设计的。所以我不会。

    所以是的,你最好的办法是把它装成一根绳子,然后把它储存起来。

    应该注意的是,varchar会浪费空间,因为您确实知道数据将占用多少空间,并且可以精确地分配它。(有固定宽度的行是一件好事)

        4
  •  0
  •   Noah Goodrich    16 年前

    严格来说,您可以使用以下方法来完成这项工作:

    $bools = array(0,1,1,0,1,0,0,1);
    $for_db = serialize($array);
    
    // Insert the serialized $for_db string into the database. You could use a text type
    // make certain it could hold the entire string.
    // To get it back out:
    
    $bools = unserialize($from_db);
    

    也就是说,我强烈建议寻找其他解决方案。

    根据用例的不同,您可以尝试创建一个“item”表,该表与“attributes”表中的值具有多对多关系。这将是公共实体属性值数据库设计模式的标准实现,用于存储关于公共对象集的变量数据点。