什么列类型应该用于在mysql数据库中存储序列化数据? 我知道你可以使用varbinary,blob,text。什么被认为是最好的,为什么?
编辑: 我知道存储序列化数据并不“好”。我需要在这一个案例中做到这一点。如果你有答案,请相信我,并专注于这个问题。谢谢!
答案 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是不可读的。
其中L是字符长度
简单的文字应该足够了,但如果要存储更多内容则要更大。但是,在这种情况下,您可能不希望将其存储在数据库中。
答案 2 :(得分:10)
@Twisted Pear提到的长度限制是很好的理由。
还要考虑TEXT
及其同类与之关联的字符集,而BLOB
数据类型则不会。如果您只是存储原始字节数据,那么您也可以使用BLOB
而不是TEXT
。
请注意,您仍然可以将文本数据存储在BLOB
中,您不能对其进行任何考虑到字符集的SQL操作;它只是SQL的字节。但是在你的情况下这可能不是问题,因为它是具有SQL未知结构的序列化数据。您需要做的就是存储字节和获取字节。字节的解释取决于您的应用程序。
我使用某些客户端库(例如PHP)使用LONGBLOB
或LONGTEXT
也遇到了麻烦,因为客户端试图分配一个与最大可能数据类型一样大的缓冲区,而不知道有多大内容将在任何给定的行上,直到它被提取。这导致PHP在尝试分配4GB缓冲区时迸发火焰。我不知道你正在使用什么客户端,或者它是否遭受同样的行为。
解决方法:使用MEDIUMBLOB
或BLOB
,只要这些类型足以存储序列化数据。
关于人们告诉你不要这样做的问题,我不会告诉你(尽管我是SQL倡导者)。确实,您不能使用SQL表达式对序列化数据中的各个元素执行操作,但这不是您的目的。通过将数据放入数据库获得的收益包括:
答案 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)间歇性地抛出序列化错误。