Найти и заменить текст во всей таблице, используя запрос MySQL
Обычно я использую ручной поиск, чтобы заменить текст в базе данных MySQL с помощью phpmyadmin. Я устал от этого, как я могу выполнить запрос, чтобы найти и заменить текст новым текстом во всей таблице в phpmyadmin?
Пример: найти ключевое слово domain.com
, заменить www.domain.com
,
16 ответов
Для single table
Обновить
UPDATE `table_name`
SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')
От multiple tables
-
Если вы хотите редактировать из всех таблиц, лучше всего взять dump
а потом find/replace
и загрузить его обратно.
Самый простой способ, который я нашел, - выгрузить базу данных в текстовый файл, выполнить команду sed для замены и перезагрузить базу данных обратно в MySQL.
Все команды bash на Linux из памяти.
Дамп базы данных в текстовый файл
mysqldump -u user -p databasename > ./db.sql
Запустите команду sed, чтобы найти / заменить целевую строку
sed -i 's/oldString/newString/g' ./db.sql
Перезагрузите базу данных в MySQL
mysql -u user -p databasename < ./db.sql
Очень просто.
Выполнение SQL-запроса в PHPmyadmin для поиска и замены текста во всех сообщениях блога WordPress, например, поиск mysite.com/wordpress и замена его на mysite.com/news. Таблица в этом примере - tj_posts
UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Поместите это в php-файл и запустите, и он должен делать то, что вы хотите.
// Connect to your MySQL database.
$hostname = "localhost";
$username = "db_username";
$password = "db_password";
$database = "db_name";
mysql_connect($hostname, $username, $password);
// The find and replace strings.
$find = "find_this_text";
$replace = "replace_with_this_text";
$loop = mysql_query("
SELECT
concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s
FROM
information_schema.columns
WHERE
table_schema = '{$database}'")
or die ('Cant loop through dbfields: ' . mysql_error());
while ($query = mysql_fetch_assoc($loop))
{
mysql_query($query['s']);
}
Php MyAdmin включает удобный инструмент для поиска и замены.
Выберите таблицу, затем нажмите " Поиск" > " Найти и заменить".
Этот запрос занял около минуты и успешно заменил несколько тысяч экземпляров oldurl.ext
с newurl.ext
в столбце post_content
Лучшее в этом методе: вы можете проверять каждое совпадение перед фиксацией.
NB Я использую phpMyAdmin 4.9.0.1
Другой вариант - создать операторы для каждого столбца в базе данных:
SELECT CONCAT(
'update ', table_name ,
' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');'
) AS statement
FROM information_schema.columns
WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%';
Это должно создать список операторов обновления, которые вы затем сможете выполнить.
UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);
Как, например, если я хочу заменить все вхождения Джона Марком, я буду использовать ниже,
UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Если вы уверены, что ни одно из обновляемых полей не сериализовано, приведенные выше решения будут работать хорошо.
Однако, если какое-либо из полей, нуждающихся в обновлении, содержит сериализованные данные, запрос SQL или простой поиск / замена в файле дампа приведет к прерыванию сериализации (если в замененной строке не будет точно такое же количество символов, что и в искомой строке).
Безусловно, "сериализованное" поле выглядит так:
a:1:{s:13:"administrator";b:1;}
Количество символов в соответствующих данных кодируется как часть данных.
Сериализация - это способ преобразовать "объекты" в формат, который легко сохраняется в базе данных, или легко переносить данные объекта между разными языками.
Вот объяснение различных методов, используемых для сериализации объектных данных, и почему вы можете захотеть это сделать, и вот статья, посвященная WordPress: Сериализованные данные, что это значит и почему это так важно? простым языком.
Было бы замечательно, если бы в MySQL был какой-то встроенный инструмент для автоматической обработки сериализованных данных, но этого не происходит, а поскольку существуют разные форматы сериализации, в этом даже не было бы смысла.
wp-cli
Некоторые из приведенных выше ответов казались специфичными для баз данных WordPress, которые сериализуют большую часть своих данных. WordPress предлагает инструмент командной строки, Wp поиск замены, что делает ручки сериализации.
Базовая команда будет такой:
wp search-replace 'an-old-string' 'a-new-string' --dry-run
Однако WordPress подчеркивает, что guid
никогда не следует изменять, поэтому рекомендуется пропустить этот столбец.
Это также говорит о том, что часто вам нужно пропуститьwp_users
Таблица.
Вот как это будет выглядеть:
wp search-replace 'https://old-domain.com' 'https://shiney-new-domain.com' --skip-columns=guid --skip-tables=wp_users --dry-run
Примечание: я добавил --dry-run
флаг, поэтому копирование и вставка не приведет к автоматическому разрушению чьей-либо базы данных. Убедившись, что сценарий делает то, что вы хотите, запустите его еще раз без этого флага.
Плагины
Если вы используете WordPress, существует также множество бесплатных и коммерческих плагинов, которые предлагают графический интерфейс для выполнения того же самого, упакованные с множеством дополнительных функций.
Interconnect / it php script
Interconnect / предлагает php-скрипт для обработки сериализованных данных: инструмент безопасного поиска и замены. Он был создан для использования на сайтах WordPress, но похоже, что его можно использовать в любой базе данных, сериализованной PHP.
Многие компании, включая сам WordPress, рекомендуют этот инструмент. Инструкции здесь, примерно на 3/4 страницы.
UPDATE `MySQL_Table`
SET `MySQL_Table_Column` = REPLACE(`MySQL_Table_Column`, 'oldString', 'newString')
WHERE `MySQL_Table_Column` LIKE 'oldString%';
Я считаю, что "swapnesh" ответ будет лучшим! К сожалению, я не смог выполнить его в phpMyAdmin (4.5.0.2), который, хотя и нелогичен (и перепробовал несколько вещей), постоянно повторял, что было найдено новое утверждение и что разделитель не найден…
Таким образом, я пришел к следующему решению, которое могло бы быть полезным, если вы испытываете ту же проблему и не имеете другого доступа к базе данных, кроме PMA…
UPDATE `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
SET `toUpdate`.`guid`=`updated`.`guid`
WHERE `toUpdate`.`ID`=`updated`.`ID`;
Чтобы проверить ожидаемый результат, вы можете использовать:
SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid`
FROM `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
WHERE `toUpdate`.`ID`=`updated`.`ID`;
В случае предложений с прописными - строчными буквами, мы можем использовать BINARY REPACE
UPDATE `table_1` SET `field_1` = BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Вот пример того, как найти и заменить в базе данных
UPDATE TABLE_NAME
SET COLUMN = replace(COLUMN,'domain.example', 'www.domain.example')
TABLE_NAME
=> Измените его на имя вашей таблицы
COLUMN
=> Измените его на свой столбец, убедитесь, что он существует
В лучшем случае вы экспортируете его в виде файла sql и открываете его в редакторе, таком как код Visual Studio, и находите и перераспределяете ваши слова. я заменяю в 1 гигабайтном файле sql за 1 минуту на 16 слов, что в сумме составляет 14600 слов. это лучший способ. и после замены сохраните и снова импортируйте. не забудьте сжать его с помощью zip для импорта.
если вы хотите использовать регулярное выражение
UPDATE `table` SET `field_name` = REGEXP_REPLACE(`same_field_name`, 'unwanted_text', 'wanted_text')
Генерация запросов на изменение SQL (FAST)
mysql -e "SELECT CONCAT ('update', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Как оператор FROM information_schema.columns WHERE table_name LIKE 'wp_%'" -u root -p your_db_name_here > upgrade_script.sql
Удалите весь мусор в начале файла. У меня было немного.
nano upgrade_script.sql
Запустите сгенерированный скрипт с опциями --force, чтобы пропустить ошибки. (МЕДЛЕННО - возьмите кофе, если большая БД)
mysql -u root -p your_db_name_here --force
Мне повезло с этим запросом при поиске и замене в phpmyadmin:
ОБНОВИТЬ
tableName
УСТАНОВИТЬ = 'foo' ГДЕ
fieldName1
= 'бар';
Конечно, это относится только к одной таблице за раз.