A plain SQL find-and-replace on a WordPress database corrupts every serialised array containing the string, because PHP serialisation records string lengths and the replacement changes them.
$ wp search-replace 'https://old.example' 'https://new.example' --dry-run
Success: 4,120 replacements to be made.
$ wp search-replace 'https://old.example' 'https://new.example'
--skip-columns=guid --precise --all-tables-with-prefix
--dry-run first is not optional; it takes seconds and reports per table. Skipping guid is the convention because the GUID is an identifier rather than a URL and changing it makes feed readers treat every post as new. --precise forces PHP-level replacement rather than the faster SQL path, which is slower and handles nested serialisation correctly — worth it on any database that has been through a few plugins.