我的情况:
我在包含博客帖子的字段中有url。该网址与转义字符一起存储在我的数据库中。目前,我的任务是将某些已经插入的“ http”网址替换为“ https”网址,但是REPLACE既不会匹配原始网址,也不会匹配转义的网址。我不能只替换“ http:”的每个实例,因为我只想影响每个帖子中的某些链接,而不是每个链接。
我对SQL和REPLACE非常熟悉,所以我不仅在询问REPLACE如何工作以及如何使用它。这里的另一个用户已经在他的环境中测试了我的查询,并且它们可以正常工作。因此,在我的配置中一定有一些东西阻止查询按预期运行。
我已经在这个网站和Google上进行了广泛的搜索,长达几个小时,但没有发现专门解决我的问题的信息。我尝试过的所有内容都包含在下面,如果还有其他需要尝试的地方,我不知道那是什么,并且我还没有发现任何建议或建议可以做任何其他事情。
示例网址:
http://test01.mysite.com
存储在数据库中:
http:\/\/test01.mysite.com
重新创建情境的代码:
DROP TABLE IF EXISTS test_posts;
CREATE TABLE IF NOT EXISTS test_posts (
id int NOT NULL AUTO_INCREMENT,
post_content longtext NOT NULL,
PRIMARY KEY (id)
)
INSERT INTO
test_posts
(post_content)
VALUES
('content content content <a href="http:\\/\\/test01.mysite.com">Link I want to change</a> content content content <a href="http:\\/\\/someothersite.com">Link I don\'t want to change</a> content content content <a href="http:\\/\\/test01.mysite.com">Link I want to change</a> content content content <a href="http:\\/\\/someothersite.com">Link I don\'t want to change</a>');
如果我运行
UPDATE
test_posts
SET
post_content = REPLACE(post_content, 'http://test01.mysite.com', 'https://test01.mysite.com');
或
UPDATE
test_posts
SET
post_content = REPLACE(post_content, 'http:\/\/test01.mysite.com', 'https://test01.mysite.com');
零记录受到影响。
出于测试目的,我运行了以下查询,该查询返回0行。
SELECT
*
FROM
test_posts
WHERE
post_content LIKE '%http://test01.mysite.com%'
OR
post_content LIKE '%http:\/\/test01.mysite.com%'
OR
post_content LIKE '%http:\\/\\/test01.mysite.com%'
OR
post_content LIKE 'http:%/%/test01.mysite.com%';
如果我跑步:
SELECT
*
FROM
test_posts
WHERE
post_content LIKE '%http:_/_/test01.mysite.com%'
它确实返回匹配项,但是并不能解决使用UPDATE / REPLACE时如何匹配的真正问题。
我在两个不同的服务器上尝试过,但在两个服务器上都得到相同的结果。
我尝试了以下引擎/排序规则组合,并且都返回相同的0条记录结果:
MyISAM / latin1_swedish_ci
MyISAM / utf8mb4_unicode_ci
InnoDB / latin1_swedish_ci
InnoDB / utf8mb4_unicode_ci
任何人都知道如何编写这些查询,以便REPLACE可以找到与这些URL匹配的内容,或者我的数据库或PhpMyAdmin中的哪些设置可能导致查询返回/影响0行?
答案 0 :(得分:1)
我认为反斜杠必须在MySQL中转义
field_name LIKE 'http:\\/\\/test01.mysite.com%'
当然可以肯定并使用单个字符通配符_
_
field_name LIKE 'http:_/_/test01.mysite.com%'
或两种情况:可选的反斜杠:
field_name LIKE 'http:%/%/test01.mysite.com%'
答案 1 :(得分:1)
对于使用LIKE的查询为什么行不通,我仍然感到困惑,但是,遗憾的是,使用那些查询来缩小问题范围使我的判断蒙上了阴影,并且我没有在REPLACE函数中尝试所有相同的组合。 / p>
以下作品:
UPDATE
test_posts
SET
post_content = REPLACE(post_content, 'http:\\/\\/test01.mysite.com', 'https://test01.mysite.com');
如果有人可以向我解释为什么这些组合可用于REPLACE,但不适用于LIKE,我真的很想知道。谢谢!
答案 2 :(得分:0)
没有理由,如果您运行正常,则查询将无法进行,还有其他问题,您可能会在这里丢失。
UPDATE
test1
SET
name_1 = REPLACE(name_1, 'http:\/\/test01.mysite.com', 'https://test01.mysite.com')
效果很好,并且可以将\/
替换为/
。
参见附件的屏幕截图,
您可能还有其他问题,请检查并更新问题。
评论后编辑
如果URL中有更多数据点,请按如下所示更改查询。
UPDATE
test1
SET
name_1 = REPLACE(name_1, '\/', '/')
以上将所有\/
替换为/
。
答案 3 :(得分:0)