MySQL更新/替换序列化数据而不会破坏它

时间:2017-02-15 20:08:45

标签: php mysql serialization drupal mariadb

我的任务是在整个Drupal 8站点上对一个单词运行查找/替换。这是一个像“wOrd”这样的混合案例,我需要与“WORD”交换。

Drupal 8正在运行MariaDB,因此REGEXP_REPLACE函数非常方便。例如:

UPDATE node__body SET body_value = REGEXP_REPLACE(body_value, 'wOrd', 'WORD') WHERE BINARY body_value REGEXP '[[:<:]]w[[:upper:]]rd[[:>:]]'

我正在使用BINARY来确保区分大小写并且只匹配“wOrd”的实例。

足够的序言 - 一些表使用BLOB代替TEXT来存储序列化数据的长字符串,如Drupal 7和许多其他CMS和各种框架中所示。我的问题是,是否可以处理序列化数据中的手动更新/替换功能,而无需通过代码对其进行过滤以首先对其进行反序列化。

在这种特殊情况下,序列化字段的长度不会改变,因此我可以毫无问题地运行更新/替换。据我所知,“wOrd”和“WORD”之间没有区别。但是,我遇到了许多情况,客户突然想要进行网站范围的更改,因为我没有足够的时间来匹配字符串长度。

我不得不编写一个实用程序来处理序列化吗?如果是这样,人们可以分享他们的看法吗?

如果您需要我详细说明,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:0)

术语“序列化”过于宽泛,无法为您的案例提供特别的内容。这可能意味着许多不同的方式。 比如,想象blob数据是压缩的 - 因此任何替换都会破坏整个事物。

因此,如果您知道序列化发生的方式,并且您非常确定数据是按1:1映射的 - 那么您可以像处理原始文本一样处理它。

但如果你不这样做(而且看起来如此) - 那么唯一真正安全的方法就是,反序列化 - 改变 - 序列化。

PS其他选项是将整个数据集反序列化一次。