С уважением, то, как вы надеетесь выполнить эту задачу, пугает меня до чертиков.У вас есть ценные данные, которые накапливаются за период, без сомнения, лет, и вы надеетесь заменить их на глобальном уровне?Вы могли бы это сильно испортить.
Было бы намного мудрее найти таблицы и столбцы, которые нужно изменить, просмотреть их, а затем менять их по одному.В принципе, довольно просто обновлять URL-адреса в столбцах.Что-то вроде этого должно сделать это.
UPDATE table
SET link = REPLACE(link, 'https://former.example.com', 'https://new.example.com')
WHERE link like CONCAT('%','https://former.example.com','%')
Обратите внимание, что эта замена заменяет ссылки https на имя конкретного хоста / домена.Это не очень беспорядочная стратегия замены:
- она не изменит данные, если это не https url
- , она обновляет только те строки, которые необходимо обновить (из-за предложения WHERE)
- он только обновляет таблицу и столбец, который вы хотите обновить.
Если ваши таблицы были созданы с помощью php, вы должны быть осторожны.Некоторые столбцы в вашей базе данных могут содержать сериализованные данные php - вывод serialize()
.Несмотря на то, что разработчики баз данных ограничиваются базами данных с сериализованными данными, хранящимися в столбцах базы данных, это распространено.(WordPress делает это в таблице wp_options, например).
Проблема заключается в следующем:
$links = array(
'top' => 'https://former.example.com/index.php'
);
$serial = serialize($links);
помещает это в $serial
, кодируя длину строки (s:36"
).
a:2:{s:3:"top";s:36:"https://former.example.com/index.php";}
И если вы просто измените URL в этих сериализованных данных, вы измените фактическую длину строки без изменения закодированной длины.Это портит сериализованные данные.(Размус Лердорф и другие авторы php выбрали хороший формат сериализованных данных? Это разговор на другой день).
Так что, если вы собираетесь обновить сериализованные текстовые строки в вашей базе данных с помощью MySQL REPLACE()
или чего-то подобного, вы не сможете изменить его длину.
Моя точка зрения: понять, чтоВы обновляете его перед обновлением.
Вы можете запросить information_schema.COLUMNS
, чтобы написать список запросов, которые будут искать текстовую строку, которую вы хотите изменить, во всех ваших столбцах.
SET @string = 'former.example.com';
SELECT CONCAT(
'SELECT COUNT(*) FREQUENCY ,',
COLUMN_NAME, ' ''VALUE'', ',
'''', TABLE_NAME , ''' TABLE_NAME, ',
'''', COLUMN_NAME ,''' COLUMN_NAME ',
'FROM ',TABLE_NAME,' ',
'WHERE ', COLUMN_NAME,' LIKE ''%', @string, '%'' ',
'GROUP BY ', COLUMN_NAME, ' ORDER BY 1 DESC'
) query
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND DATA_TYPE = 'varchar'
Затем вы можете просмотреть каждый столбец в каждой таблице, содержащей строку, которую вы хотите заменить.Только тогда вы можете быть уверены, что замените его правильно.