mysql:为什么使用replace时url不匹配?

mklgxw1f  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(650)

我的情况:
我在一个包含博客文章的字段中有url。url用转义字符存储在我的数据库中。我目前的任务是将一些已经插入的“http”url替换为“https”url,但是替换既不会匹配原始url,也不会匹配转义的url。我不能只替换“http:”的每个示例,因为我只想影响每个帖子中的某些链接,而不是每个链接。
我非常熟悉sql和replace,所以我不仅仅是问replace是如何工作的以及如何使用它。这里的另一个用户已经在他的环境中测试了我的查询,它们可以正常工作。所以,我的配置中肯定有什么东西阻止了查询按预期运行。
我已经搜索了这个网站和谷歌广泛的几个小时,没有找到任何具体解决我的问题。我尝试过的每件事都包括在下面,如果还有什么我应该尝试的,我不知道那是什么,我也没有发现任何建议/帖子/评论建议我做任何不同的事情。
示例url:

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/utf8mb4\u unicode\u ci
innodb/拉丁语/瑞典语
innodb/utf8mb4\u unicode\u ci
有人知道我如何编写这些查询以便replace找到与这些url的匹配项,或者知道我的数据库或phpmyadmin中的哪些设置可能导致查询返回/影响0行吗?

63lcw9qa

63lcw9qa1#

我认为反斜杠必须在mysql中转义

field_name LIKE 'http:\\/\\/test01.mysite.com%'

当然可以肯定地使用单字符通配符 _ _

field_name LIKE 'http:_/_/test01.mysite.com%'

或者对于这两种情况:可选的反斜杠:

field_name LIKE 'http:%/%/test01.mysite.com%'
0s7z1bwu

0s7z1bwu2#

作为 \\ 无法表示/转义反斜杠,请使用正则表达式函数:

REGEXP_LIKE('.*http:\\/\\/test01\.mysite.com.*')
REGEXP_REPLACE(field, 'http:\\/\\/', 'http://')

在这里 \\ 应该有用。

cdmah0mi

cdmah0mi3#

没有理由,如果您运行正常,您的查询将无法工作,这里可能缺少其他内容。 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, '\/', '/') 以上将取代所有发生的 \// .

kyks70gy

kyks70gy4#

我仍然很困惑为什么like的查询不起作用,但是,遗憾的是,用like来缩小问题范围模糊了我的判断,我没有在replace函数中尝试所有相同的组合。
以下工作:

UPDATE
    test_posts
SET 
    post_content = REPLACE(post_content, 'http:\\/\\/test01.mysite.com', 'https://test01.mysite.com');

如果有人能向我解释为什么这些组合使用replace,而不是like,我真的很想知道。谢谢!

相关问题