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

djb*_*ick 49 mysql database

什么列类型应该用于在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字段,就像关系列一样.

  • 总有一个用例,所以最好避免像DO DO DO THAT这样的答案.我之所以这么说,是因为我刚刚阅读了一个帖子,其中有人建议不要将JSON数据存储在关系数据库中.但是,正如您所指出的那样,如果不会选择数据并且您希望灵活地存储数据,那么我认为将JSON字符串存储到数据库中没有错.+1指出案例...好答案! (7认同)

Jos*_*ust 11

你打算存多少钱?查看MySQL文档中字符串类型的规范及其大小.这里的关键是你不关心索引这个列,但你也不希望它溢出并被截断,因为那时你JSON是不可读的.

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

其中L是字符长度

只是纯文本应该足够了,但如果要存储更多,则要更大.但是,在这种情况下,您可能不希望将其存储在数据库中.

  • 我理解长度限制.我更关注博客与文本存储的优缺点. (2认同)

Bil*_*win 10

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

还要考虑到它TEXT和它的同类有一个与它们相关联的字符集,而BLOB数据类型却没有.如果您只是存储原始字节数据,那么您也可以使用BLOB而不是TEXT.

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

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

解决方法:使用MEDIUMBLOB或只是BLOB,只要这些类型足以存储您的序列化数据.


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

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


小智 7

LONGTEXT

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

  • 应该使用Wordpress作为不良编码,不良做法和糟糕选择的一个例子.如果有的话,WordPress的是**怎么还没来设计应用程序的例子** (16认同)