Мне поручено выполнять поиск/замену на одно слово на всем сайте Drupal 8. Это смешанное слово, подобное «wOrd», которое мне нужно заменить «WORD».MySQL обновляет/заменяет сериализованные данные без повреждения его
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». Тем не менее, я столкнулся со многими ситуациями, когда клиент вдруг хочет сделать изменения на сайте, где мне не повезло, если длина строки будет соответствовать.
Неужели мне нужно написать утилиту для обработки сериализации? Если да, могут ли люди поделится им с этим?
Если вам нужно, чтобы я подробно разбирался в чем-либо, просто сообщите мне.
Спасибо.
В этом случае это поле LONGBLOB с открытым текстом. Внутренние части Drupal 8 обрабатывают сериализацию, которая, как я полагаю, сводится к сериализации() unserialize(). Это выглядит как 'a: 12: {s: 4:" uuid "; s: 36:" 14eb8e72-bd6d-47c4-ab92-c297d81a287f "; s: 8:" langcode "; s: 2:" en "; s : 6: "статус", б: 1; s: 12: "зависимости"; а: 3: {s: 7: "содержание", а: 1: {я: 0; s: 56: "block_content: основные: 37272863-0339-4b0c-81dc-9476ea17c52f ";}}' Я должен был отрезать его из-за длины. – JDev518
Насколько я понимаю, ваша цель будет выглядеть так: s: 4: «wOrd», и вы собираетесь сделать это s: 4: «WORD», это правильно? –
Справа. Мой главный вопрос заключается в том, как справиться с этим, если мне нужно изменить его на то, что не очень хорошо вписывается в сериализованную строку. Например, если бы мне пришлось изменить слово «слово» на «слово». Похоже, что моим единственным вариантом было бы изменить 's: 4:« word »на s: 8:« слово ». В противном случае он больше не будет сериализован правильно и будет поврежден. Я выяснил проблему «wOrd» на «WORD» - количество строк и длина строки, которую я изменяю в поле БД, не изменяется. – JDev518