Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL在不损坏序列化数据的情况下更新/替换序列化数据_Php_Mysql_Serialization_Drupal_Mariadb - Fatal编程技术网

Php MySQL在不损坏序列化数据的情况下更新/替换序列化数据

Php MySQL在不损坏序列化数据的情况下更新/替换序列化数据,php,mysql,serialization,drupal,mariadb,Php,Mysql,Serialization,Drupal,Mariadb,我的任务是在整个Drupal8站点上运行一个单词的查找/替换。这是一个混合大小写的单词,比如“word”,我需要用“word”来替换 Drupal8正在运行MariaDB,因此REGEXP\u REPLACE函数非常方便。例如: UPDATE node__body SET body_value = REGEXP_REPLACE(body_value, 'wOrd', 'WORD') WHERE BINARY body_value REGEXP '[[:<:]]w[[:upper:]]rd[

我的任务是在整个Drupal8站点上运行一个单词的查找/替换。这是一个混合大小写的单词,比如“word”,我需要用“word”来替换

Drupal8正在运行MariaDB,因此REGEXP\u REPLACE函数非常方便。例如:

UPDATE node__body SET body_value = REGEXP_REPLACE(body_value, 'wOrd', 'WORD') WHERE BINARY body_value REGEXP '[[:<:]]w[[:upper:]]rd[[:>:]]'
updatenode_uuubody SET body_value=REGEXP_REPLACE(body_value,'wOrd,'wOrd'),其中二进制body_value REGEXP'[[:::]]
我使用BINARY只确保区分大小写,并且只匹配“wOrd”的实例

所以足够多的序言-一些表使用BLOB代替文本来存储序列化数据的长字符串,如Drupal7和许多其他CMS以及各种框架中所示。我的问题是,是否有可能在序列化数据中处理手动更新/替换功能,而不必先通过代码对其进行过滤以取消序列化

在这种特殊情况下,序列化字段的长度不会更改,因此我可以毫无问题地运行更新/替换。就我所知,“单词”和“单词”之间没有区别。然而,我遇到过很多情况,客户突然想要在站点范围内进行更改,而我没有足够的运气来匹配字符串长度

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

如果你需要我详细说明什么,请告诉我

谢谢。

术语“序列化”过于宽泛,无法为您的案例提供特定建议。这可能意味着许多不同的方式。 比如,想象一下blob数据是压缩的——因此任何替换都会毁掉整个过程

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

但是如果您不这样做(看起来是这样),那么唯一真正安全的方法就是,是的,反序列化使更改序列化回来

另一种选择是只反序列化整个事件,整个数据库,一次。

术语“序列化”太宽泛了,无法针对您的情况提出特定的建议。这可能意味着许多不同的方式。 比如,想象一下blob数据是压缩的——因此任何替换都会毁掉整个过程

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

但是如果您不这样做(看起来是这样),那么唯一真正安全的方法就是,是的,反序列化使更改序列化回来


PS另一种选择是只对整个数据库反序列化一次。

在这种情况下,它是一个带有纯文本的LONGBLOB字段。Drupal8的内部处理序列化,我假设它可以归结为serialize()unserialize()。它看起来像是
a:12:{s:4:“uuid”;s:36:{14eb8e72-bd6d-47c4-ab92-c297d81a287f;s:8:“langcode”;s:2:“en”;s:6:“status”;b:1;s:12:“dependencies”;a:3:{s:7:“content”;a:1:{i:0;s:56:“block_content:basic:37272863-0339-4b0c-81dc-9476ea17c52f”}
-由于长度的关系,我不得不把它切掉。至于你的目标词:“s:4”,你打算把它改成s:4:“单词”,对吗?对。我的主要问题是,如果我需要将它改成与序列化字符串不匹配的内容,如何处理它。例如,如果我必须将“单词”改成“单词”。听起来我唯一的选择是将
s:4:“单词”改成s:8:“单词”
。否则它将不再正确序列化并被损坏。我已经找到了“wOrd”到“wOrd”之间的对应关系问题-我在DB字段中更改的字符串数量和长度没有更改。对,问题是:您试图侵入您并不完全了解的内容。除了您提到的情况(当字段长度更改时)-如果,比如说,它计算序列化内容的校验和呢?如果涉及外部搜索索引呢?等等,甚至在您提到的情况下:您至少需要实现序列化器机制的一部分(例如,保持字段长度一致性)-但它已经实现了!所以,再次证明,您唯一安全的选择是反序列化-通过-序列化-放回原位。我知道我正在进行一些可能的侵入性更改:)关于校验和的观点很好。我将深入后端,看看如何处理更新。感谢您提供的信息。在这种情况下,这是一个错误带有纯文本的NGBLOB字段。Drupal 8的内部处理序列化,我假设可以归结为序列化()非序列化()。它看起来像
a:12:{s:4:“uuid”;s:36:“14eb8e72-bd6d-47c4-ab92-c297d81a287f”;s:8:“langcode”;s:2:“en”;s:6:“状态”;b:1;s:12:“依赖项”;a:3:{s:7:“内容”;a:1:{I:0;s:56:“block_content:basic:37272863-0339-4b0c-81dc-9476ea17c52f”}
-由于长度原因,我不得不将其截断。据我所知,您的目标将如下所示:s:4:“wOrd”,您打算将其设为s:4:“wOrd”,对吗?对。我的主要问题是,如果我需要将其更改为不适合序列化字符串的内容,如何处理它。例如,如果我必须将“word”更改为“the word”。听起来我唯一的选择是将
s:4:“word”更改为s:8:“the word”
。否则它将不再正确序列化并被损坏。我已经找到了“wOrd”到“wOrd”之间的对应关系问题-我在DB字段中更改的字符串数量和长度没有更改。对,问题是:您试图侵入您并不完全了解的内容。除了您提到的情况(当字段长度更改时)-如果,比如说,它计算序列化内容的校验和呢?如果涉及外部搜索索引呢?等等,等等。甚至在您提到的情况下:您至少需要实现序列化器机制的一部分(例如,保持字段长度的一致性)-但这是切实可行的