哪种mysql列类型适用于序列化数据?

14

我正在使用php序列化许多数组,并将其存储在使用mysql的数据库中。

最终字符串的长度可能会大大变化,从2000到100,000+之间的任何值都有可能。我想知道这种情况下最好的列类型是什么?

我目前将它设置为LONGTEXT,但我觉得这太过了!该数据库已经处于活动状态,并且有大约3百万行,这是一个即将添加的新列。

谢谢


4
10万个字符非常限制了你的选择。此外,如果您想在MySQL中操作这些数组或搜索它们,或者基本上做任何除了将它们视为大块数据之外的事情,您应该正确地存储它们而不是序列化它们。 - Corbin
这只是一个数据存储中心,通过php显示,不会进行mysql操作。谢谢@corbin - hadley
最好使用longbinary字段类型。所有文本字段都会受到字符集转换的影响,这可能会破坏您的序列化数据。 - Marc B
2个回答

21

在序列化数据时,始终使用任何BLOB数据类型以使其不被截断并以二进制安全的方式进行序列化。如果没有对最终字符串长度的限制,则需要使用LONGBLOB。如果您知道数据不会填满2 ^ 24个字符,则可以使用MEDIUMBLOBMEDIUMBLOB大约为16MB,而LONGBLOB大约为4GB,因此我认为您可以放心使用MEDIUMBLOB

为什么是二进制数据类型? MySQL中的文本数据类型具有编码。字符编码将影响序列化数据在不同编码之间的转置方式。例如,当以Latin-1存储但以UTF-8读出(例如由于数据库驱动程序连接编码设置)时,序列化数据可能会损坏,因为二进制偏移量已经发生了变化,而序列化数据没有为此类偏移进行编码。PHP的序列化字符串是二进制数据,没有特定编码。


7
根据PHP手册中serialize()的说明,您应该选择BLOB(如Marc B所述):
“请注意,这[输出]可能包含null字节的二进制字符串,因此需要将其存储和处理为二进制。例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是CHAR或TEXT字段。”
来源:http://php.net/serialize 当然,您还需要牢记J.Money关于大小的建议 - 即使是BLOB也有其限制,如果您要超过这些限制,则需要使用MEDIUMBLOB或LONGBLOB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接