什么列类型应该用于在mysql数据库中存储序列化数据?我知道你可以使用varbinary,blob,text.什么被认为是最好的,为什么?
编辑:我知道存储序列化数据并不"好".我需要在这一个案例中做到这一点.如果你有答案,请相信我,并专注于这个问题.谢谢!
gab*_*ous 63
要回答:文本在很多DBMS中都被弃用了,所以最好使用blob或具有高限制的varchar(并且使用blob你不会得到任何编码问题,这是varchar和text的主要麻烦) .
同样正如MySQL论坛中的这个主题所指出的那样,硬盘驱动器比软件便宜,所以你最好先设计你的软件并让它工作,只有这样,如果空间成为一个问题,你可能想要优化这个方面.因此,不要过早尝试过度优化列的大小,最好先设置更大的大小(另外这样可以避免安全问题).
关于各种评论:这里的SQL狂热太多了.尽管我非常喜欢SQL和关系模型,但它们也有陷阱.
按顺序将序列化数据存储到数据库中(例如存储JSON或XML格式的数据)具有以下优点:
还有更多的其他优点,所以请不要狂热:关系数据库是一个很好的工具,但是我们不能提供其他工具.更多工具越多越好.
至于一个具体的使用示例,我倾向于在我的数据库中添加一个JSON字段来存储记录的额外参数,其中JSON数据的列(属性)将永远不会被单独SELECT'd,但仅在正确记录时使用已被选中.在这种情况下,我仍然可以使用关系列区分我的记录,并且当选择了正确的记录时,我可以将额外的参数用于我想要的任何目的.
所以我的建议是保持两全其美(速度,可串行性和结构灵活性),只需使用一些标准关系列作为区分行的唯一键,然后使用blob/varchar列,其中序列化数据将插入.通常,唯一密钥只需要两个/三个列,因此这不是主要的开销.
此外,您可能对PostgreSQL感兴趣,PostgreSQL现在具有JSON数据类型,而PostSQL项目则直接处理JSON字段,就像关系列一样.
Jos*_*ust 11
你打算存多少钱?查看MySQL文档中字符串类型的规范及其大小.这里的关键是你不关心索引这个列,但你也不希望它溢出并被截断,因为那时你JSON是不可读的.
其中L是字符长度
只是纯文本应该足够了,但如果要存储更多,则要更大.但是,在这种情况下,您可能不希望将其存储在数据库中.
Bil*_*win 10
@Twisted Pear提到的长度限制是很好的理由.
还要考虑到它TEXT
和它的同类有一个与它们相关联的字符集,而BLOB
数据类型却没有.如果您只是存储原始字节数据,那么您也可以使用BLOB
而不是TEXT
.
请注意,您仍然可以将文本数据存储在a中BLOB
,您只是不能对其进行任何考虑到charset的SQL操作; 它只是SQL的字节.但是在你的情况下这可能不是问题,因为它是具有SQL未知结构的序列化数据.您需要做的就是存储字节和获取字节.字节的解释取决于您的应用.
我也遇到过使用LONGBLOB
或LONGTEXT
使用某些客户端库(例如PHP)的麻烦,因为客户端试图分配一个与最大可能数据类型一样大的缓冲区,而不知道在获取任何给定行之前内容有多大.这导致PHP在尝试分配4GB缓冲区时迸发火焰.我不知道你正在使用什么客户端,或者它是否遭受同样的行为.
解决方法:使用MEDIUMBLOB
或只是BLOB
,只要这些类型足以存储您的序列化数据.
关于人们告诉你不要这样做的问题,我不会告诉你(尽管我是SQL倡导者).确实,您不能使用SQL表达式对序列化数据中的各个元素执行操作,但这不是您的目的.通过将数据放入数据库获得的收益包括:
小智 7
LONGTEXT
Wordpress将序列化数据作为LONGTEXT存储在其postmeta表中.我发现Wordpress数据库是研究列数据类型的好地方.