什么列类型应该用于在mysql数据库中存储序列化数据?

时间:2011-04-04 21:48:29

标签: mysql database

什么列类型应该用于在mysql数据库中存储序列化数据? 我知道你可以使用varbinary,blob,text。什么被认为是最好的,为什么?

编辑: 我知道存储序列化数据并不“好”。我需要在这一个案例中做到这一点。如果你有答案,请相信我,并专注于这个问题。谢谢!

8 个答案:

答案 0 :(得分:61)

回答:文本在很多DBMS中都被弃用了,所以最好使用blob或具有高限制的varchar(并且使用blob你不会得到任何编码问题,这是varchar的一个主要麻烦和文字)。

正如this thread at the MySQL forums中指出的那样,硬盘驱动器比软件便宜,所以你最好首先设计你的软件并让它工作,只有这样,如果空间成为一个问题,你可能想要优化它方面。因此,不要过早尝试过度优化列的大小,最好先设置更大的大小(另外这样可以避免安全问题)。

关于各种意见: 这里的SQL狂热太多了。尽管我非常喜欢SQL和关系模型,但它们也存在缺陷。

按顺序将序列化数据存储到数据库中(例如存储JSON或XML格式的数据)有一些优点:

  • 您可以为数据提供更灵活的格式:动态添加和删除字段,动态更改字段的规格等等。
  • 与对象模型的阻抗不匹配:与获取数据然后必须在程序对象的结构和关系数据库的结构之间进行处理和转换相比,存储和获取数据就像在程序中一样

还有更多其他优点,所以请不要狂热:关系数据库是一个很好的工具,但是我们不能得到其他工具。更多工具越多越好。

至于一个具体的使用示例,我倾向于在我的数据库中添加一个JSON字段来存储记录的额外参数,其中JSON数据的列(属性)将永远不会单独进行SELECT,但仅在以下时使用已经选择了正确的记录。在这种情况下,我仍然可以使用关系列区分我的​​记录,并且当选择了正确的记录时,我可以将额外的参数用于我想要的任何目的。

所以我的建议是保持两全其美(速度,可串行性和结构灵活性),只需使用一些标准关系列作为区分行的唯一键,然后使用blob / varchar列将插入序列化数据。通常,唯一键只需要两个/三列,因此这不是主要的开销。

此外,您可能对PostgreSQL感兴趣,PostgreSQL现在具有JSON数据类型,而PostSQL project可以直接处理JSON字段,就像关系列一样。

答案 1 :(得分:11)

您打算存储多少?查看string types at the MySQL docs及其sizes的规格。这里的关键是你不关心索引这个列,但你也不希望它溢出并被截断,因为那时你JSON是不可读的。

  • TINYTEXT L< 2 ^ 8
  • TEXT L< 2 ^ 16
  • MEDIUMTEXT L< 2 ^ 24
  • LONGTEXT L< 2 ^ 32

其中L是字符长度

简单的文字应该足够了,但如果要存储更多内容则要更大。但是,在这种情况下,您可能不希望将其存储在数据库中。

答案 2 :(得分:10)

@Twisted Pear提到的长度限制是很好的理由。

还要考虑TEXT及其同类与之关联的字符集,而BLOB数据类型则不会。如果您只是存储原始字节数据,那么您也可以使用BLOB而不是TEXT

请注意,您仍然可以将文本数据存储在BLOB中,您不能对其进行任何考虑到字符集的SQL操作;它只是SQL的字节。但是在你的情况下这可能不是问题,因为它是具有SQL未知结构的序列化数据。您需要做的就是存储字节和获取字节。字节的解释取决于您的应用程序。

我使用某些客户端库(例如PHP)使用LONGBLOBLONGTEXT也遇到了麻烦,因为客户端试图分配一个与最大可能数据类型一样大的缓冲区,而不知道有多大内容将在任何给定的行上,直到它被提取。这导致PHP在尝试分配4GB缓冲区时迸发火焰。我不知道你正在使用什么客户端,或者它是否遭受同样的行为。

解决方法:使用MEDIUMBLOBBLOB,只要这些类型足以存储序列化数据。


关于人们告诉你不要这样做的问题,我不会告诉你(尽管我是SQL倡导者)。确实,您不能使用SQL表达式对序列化数据中的各个元素执行操作,但这不是您的目的。通过将数据放入数据库获得的收益包括:

  • 将序列化数据与其他更多关系数据相关联。
  • 能够根据事务范围存储和获取序列化数据,COMMIT,ROLLBACK。
  • 将所有关系数据和非关系数据存储在一个位置,以便更轻松地复制到从属服务器,备份和还原等等。

答案 3 :(得分:7)

LONGTEXT

  

Wordpress将序列化数据作为LONGTEXT存储在其postmeta表中。我发现Wordpress数据库是研究列数据类型的好地方。

答案 4 :(得分:2)

从MySQL 5.7.8开始,MySQL支持本机JSON数据类型:MySQL Manual

答案 5 :(得分:2)

我可能会迟到,但有关序列化对象的php.net文档说明如下:

  

请注意,这是一个二进制字符串,可能包含空字节,和   需要存储和处理。例如,serialize()   输出通常应存储在数据库的BLOB字段中,   而不是CHAR或TEXT字段。

来源:http://php.net/manual/en/function.serialize.php

希望有所帮助!

答案 6 :(得分:-1)

除非序列化数据除了从数据库保存和恢复之外没有其他用途,否则您可能不希望这样做。

通常,序列化数据有几个字段,应作为单独的列存储在数据库中。每个序列化数据项通常都是一个单独的列。其中一些列自然是关键字段。除了数据之外,还可能添加其他列以指示插入发生的日期+时间,负责用户等等。

答案 7 :(得分:-4)

我找到了:

varchar(5000)

是我们规模/速度的最佳平衡。此外,它适用于rails 3序列化数据(varbinary)间歇性地抛出序列化错误。