Mysql
mysql > 為什麼替換命令不適用於來自 json 編碼的字元串?
說在我的 wordpress 數據庫中,我有一個包含如下字元串的 post_content 列:
href=\"http:\/\/dev.example.com\/example\/wp-content\/uploads\/2019\/07\/my.pdf\"
以上是字元串的一部分(放置在文本內的連結中),它來自使用 json 作為數據格式的外掛 (acf) 保存的數據。
然後我跑
UPDATE wp_posts SET post_content = REPLACE(post_content,'http:\/\/dev.example.com\/example\/', 'https:\/\/www.example.com\/');
好吧,那是行不通的。零行受影響並且沒有錯誤。為什麼?我究竟做錯了什麼?
這種程式碼來自 wordpress 中的 acf plugin gutenberg 塊,那是因為它是 json 編碼的。但據我所知,應該像對待任何其他字元串一樣對待.. 怎麼了?
更準確地說,我在下面附上了一張來自 sequelpro 和 cli 的圖片,以證明反斜杠的存在(見評論)。
作為入門,看起來數據是使用轉義字元
\
反斜杠儲存的,以允許 WordPress 伺服器自動使用引擎本身中的數據。您必須將反斜杠加倍才能查找和替換字元串。
您可以通過 dbfiddle.uk 驗證這一點。
如果您對 MySQL 8.0 實例執行搜尋字元串,如下所示:
select 'http:\/\/dev.example.com\/example\/'
…然後你會收到這個:
http://dev.example.com/example/
參考: 問題 255169 的db<>fiddle (db<>fiddle)
這不是儲存在數據庫中的內容,因此不會被發現。
解決方案
解決方案是將(MySQL)轉義字元加倍
\
為:select 'http:\\/\\/dev.example.com\\/example\\/'
…返回這個:
http:\/\/dev.example.com\/example\/
參考: 問題 255169 的db<>fiddle (db<>fiddle)