我的情况:
我在一个包含博客文章的字段中有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行吗?
4条答案
按热度按时间63lcw9qa1#
我认为反斜杠必须在mysql中转义
当然可以肯定地使用单字符通配符
_
_或者对于这两种情况:可选的反斜杠:
0s7z1bwu2#
作为
\\
无法表示/转义反斜杠,请使用正则表达式函数:在这里
\\
应该有用。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, '\/', '/')
以上将取代所有发生的\/
与/
.kyks70gy4#
我仍然很困惑为什么like的查询不起作用,但是,遗憾的是,用like来缩小问题范围模糊了我的判断,我没有在replace函数中尝试所有相同的组合。
以下工作:
如果有人能向我解释为什么这些组合使用replace,而不是like,我真的很想知道。谢谢!