【PHP】序列化的陷阱

把数组和自定义类放入数据库中,然后以后再使用它们,是不是会觉得很方便呢?
在这种情况下,serialize就非常有用了。(什么是serialize?)
虽然也可以使用JSON,但由于类型信息会丢失,所以经常会使用serialize。
但是,你们在将serialize的信息放入数据库时是怎么处理的呢?
难道是直接插入text类型的列吗?(我以前就是将其直接插入text类型的列中)
即使返回值是字符串,把它放入text类型的列也是不行的。

我之前有趣地制作了一个Web应用程序,它让我入迷了,因此我尝试概括总结了一些要点。

这是什么问题? (Zhè shì ?)

实际上,将序列化为字符串后存入text类型的列中,在反序列化时可能会出现问题。
插入本身没有问题,也不会出现错误或抛出异常。
但此时存储在数据库中的数据已经损坏,无法进行反序列化,因此无法恢复。

为什么会发生这样的事情呢?简单来说,是因为在插入数据时发生了数据缺失,导致在反序列化时无法正确恢复为原始状态。

虽然在插入时发生数据缺失并不会对插入本身造成问题,但是数据会以不完整的状态插入到数据库中,只有在进行反序列化时才会意识到,这种情况可真是令人感到悲伤。

解决方案

在serialize方法中,返回的是一个字符串,但在DB中不能将其存储为文本。那么应该怎么办呢?
实际上,答案很简单,PHP的手册中有详细说明。

请注意,这是一个二进制字符串,有可能包含空字节。在保存或使用时,必须假设包含空字节。例如,在将serialize()的输出存储到数据库中时,通常应使用BLOB类型而不是CHAR类型或TEXT类型。

根据上述,serialize方法的返回值是一个二进制字符串,因此需要准备一个BLOB类型的列,并将其存入其中。(参考:BLOB是什么?)
serialize方法的返回值是一个字符串,但其内容是二进制字符串,因此如果将其作为普通字符串处理,可能会导致数据丢失。
仔细考虑,这其实是一个简单的问题,但由于被返回值是字符串所迷惑,导致花费了相当长的时间来解决。

这次问题通过这个方法解决了,但说实话没有进行数据验证,所以可能存在其他原因。
如果有知道其他原因的人,请务必告诉我。

填補不足之處。

实际上,MySQL的BLOB类型有几种类型,对于某些二进制数据可能无法完全存储。
参考:关于MySQL的BLOB类型。

BLOB是一个能够存储不同容量数据的大型二进制对象。BLOB类型有四种,分别是TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们之间的区别只在于能够容纳的最大长度不同。

只需提供一种选择:
只是最大长度值有四种不同,应该根据所要储存的数据大小来估计并创建表格。
由于某些要储存的数据可能超过列的尺寸,甚至在BLOB类型下可能出现数据丢失的情况,因此在创建表格时,务必要注意确认数据大小。

广告
将在 10 秒后关闭
bannerAds