Привет.
Как-то у меня возникла необходимость поменять некоторые значения в базе. Точнее требовалось заменить часть строки в полях одной таблицы при переносе сайта, сегодня я делюсь с вами этим решением.
Этот код может пригодиться когда вы меняете формат данных, например, пути к файлам при смене хостинга или номера телефонов, вы хранили их в виде +79ххххххххх, а решили хранить как 9ххххххххх. Если вам надо заменить только часть строки оставив остальное без изменений, т.е. как раз подстроку в строке в этом случае этот запрос вам ооочень пригодится.
Собственно запрос:
UPDATE table SET field = REPLACE(field, 'что_заменить', 'чем_заменить');
table_name — имя таблицы
field_name — имя поля в котором производим замену подстроки
Пример использования:
UPDATE uploads SET path = REPLACE(path, '/var/www/', '/var/home/site/htdocs/');
Таким образом путь к файлу /var/www/upload/file_name.ext превратится в /var/home/site/htdocs/upload/file_name.ext и ваш сайт будет хорошо работать на новом хостинге.
Удачи, хорошего вам кода и красивых решений.
Гранмерси, как раз проблема с заменой части путей возникла, думал придется рекурсию по детям мутить, а потом подумал — наверное можно как-то подстроку прямо в mysql везде заменить. Сэкономил кучу времени. Удачи!
Рад что смог помочь!
Не, не всё корректно. Получаю не результат, а — Data too long for column ‘model’ at row 1. Причём даже phpmyadmin не справляется
Видимо текст в поле слишком длинный. Покажите запрос вызывающий ошибку, тип поля и данные.
А как во всех таблицах и во всех полях замену провести? Можно такой sql запрос написать или внешними средствами пользоваться, например, скрипт на php написать
Это не будет работать, если в таблице есть подстрока вида ‘stroka’ и еще одна подстрока вида ‘stroka2’.
Ваш запрос
UPDATE table SET field = REPLACE(field, ‘stroka’, ‘2222’) WHERE field LIKE %stroka%;
зваменит все подстроки где есть ‘stroka’ на ‘2222’
А строка «stroka2′ примет вид ‘22222’.
Так вот, что делать если нужно оставить значение ‘stroka’ прежним, применить REPLACE только к строкам, у которых ‘stroka2’ ?
Добавление WHERE в конец вашего запроса типа WHERE field LIKE %stroka%
(как и вариации LIKE типа stroka% или %stroka) не вернут ничего.
Что тогда делать?
Не понял что вам надо сделать.
Если вы хотите заменить ‘stroka’ на ‘2222’ только там где значение ‘stroka2’ то вам надо фильтровать по WHERE field = ‘stroka2’ или если фильтруете подстроке, то WHERE field LIKE ‘%stroka2%’;
Спасибо, помогло!