Mysql

mysql > 為什麼替換命令不適用於來自 json 編碼的字元串?

  • December 10, 2019

說在我的 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)

引用自:https://dba.stackexchange.com/questions/255169