【问题标题】:Which mysql column type for serialize(data)?序列化(数据)的哪个mysql列类型?
【发布时间】:2012-05-27 01:16:08
【问题描述】:

我在 php 中序列化了很多要使用 mysql 存储在数据库中的数组。

最终字符串的长度可以在 2000 到 100,000+ 之间变化很大,我想知道最好的列类型是什么?

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

谢谢

【问题讨论】:

  • 100,000 个字符高度限制了您的选择。此外,如果您想在 MySQL 中操作这些数组或搜索它们,或者基本上做任何事情而不是将它们视为巨大的数据块,您应该正确存储它们而不是序列化。
  • 它只是一个存储中心,用于通过php显示的数据,永远不会发生通过mysql的操作。谢谢@corbin
  • 最好使用长二进制字段类型。所有文本字段都受字符集转换的影响,这可能会损坏您的序列化数据。

标签: php mysql


【解决方案1】:

始终使用任何BLOB data-type 来序列化数据,这样它就不会被切断并以二进制安全的方式破坏序列化。如果最终字符串的长度没有最大值,那么您将需要LONGBLOB。如果您知道数据不会填充 2^24 个字符,您可以使用 MEDIUMBLOBMEDIUMBLOB 大约是 16MB,而 LONGBLOB 大约是 4GB,所以我会说你使用 MEDIUMBLOB 非常安全。

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

【讨论】:

    【解决方案2】:

    您应该根据 PHP 手册为 serialize() 选择 BLOB(如 Marc B 所述):

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

    来源:http://php.net/serialize

    当然,J.Money 关于尺寸的意见也必须牢记 - 即使 BLOB 也有其限制,如果您要超过它们,那么您将需要 MEDIUMBLOB 或 LONGBLOB。

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 2017-05-07
      • 1970-01-01
      • 2010-12-08
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多