2017-02-15 23 views
1

Мне поручено выполнять поиск/замену на одно слово на всем сайте 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». Тем не менее, я столкнулся со многими ситуациями, когда клиент вдруг хочет сделать изменения на сайте, где мне не повезло, если длина строки будет соответствовать.

Неужели мне нужно написать утилиту для обработки сериализации? Если да, могут ли люди поделится им с этим?

Если вам нужно, чтобы я подробно разбирался в чем-либо, просто сообщите мне.

Спасибо.

ответ

0

Термин «сериализация» слишком широк, чтобы предложить что-то конкретное для вашего случая. Это может означать массу разных способов. Как, представьте, данные blob застегнуты молнией - таким образом, любая сделанная замена разрушит все это.

Итак, если вы знаете, как происходит сериализация, и вы уверены, что данные отображаются 1: 1 - тогда вы можете обрабатывать его так же, как и исходный текст.

Но если вы этого не сделаете (и это так кажется), то единственным по-настоящему безопасным способом это будет, да, десериализовать-изменить сериализацию.

PS Другой вариант - просто десериализировать всю вещь, всю БД, один раз.

+0

В этом случае это поле 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

+0

Насколько я понимаю, ваша цель будет выглядеть так: s: 4: «wOrd», и вы собираетесь сделать это s: 4: «WORD», это правильно? –

+0

Справа. Мой главный вопрос заключается в том, как справиться с этим, если мне нужно изменить его на то, что не очень хорошо вписывается в сериализованную строку. Например, если бы мне пришлось изменить слово «слово» на «слово». Похоже, что моим единственным вариантом было бы изменить 's: 4:« word »на s: 8:« слово ». В противном случае он больше не будет сериализован правильно и будет поврежден. Я выяснил проблему «wOrd» на «WORD» - количество строк и длина строки, которую я изменяю в поле БД, не изменяется. – JDev518

 Смежные вопросы

  • Нет связанных вопросов^_^