MySQL - 如何将随机的 8 个字节数替换为 null

MySQL - How to replace random 8 byte number to null

提问人:Ubuntubasic1864 提问时间:11/13/2023 更新时间:11/14/2023 访问量:56

问:

我在mysql数据库的文本正文中有以下样式url

  • A型:https://www.old_example1.com/12345678/myname
  • B型:https://www.old_example2.com/87654321/yourname

我想将 url 更改为以下格式

  • 类型 A:https://www.new_example1.com/myname
  • B型:http://www.new_example2.com/yourname

对于域部分,这是一个简单的替换查询,所以没什么大不了的。但是域后面的 8 字节随机数部分有点棘手。

我尝试计算文本字节并使用子字符串,但“old_example1”和“old_example2”部分并不总是一致的字节。有时长或短 1~2 个字节。但是“/”的出现是一致的,所以我试图找到一种方法来计算“/”并将第 3 和第 4 个“/”替换为“”(空值),但不知道如何应用这样的条件。

mysql url 替换

评论

0赞 Shadow 11/13/2023
这不是一个 8 字节的数字,而是一个 8 位数字,你不想用 null 替换它们,因为由任何其他字符串连接的 null 会给你 null。您希望将它们替换为空字符串并防止重复 ./
0赞 Akina 11/13/2023
使用 SUBSTRING_INDEX() 函数。
1赞 Bill Karwin 11/14/2023
在这种情况下,找出 8 个字节和 8 位数字之间的差异是分裂的,与问题无关,因为在 ASCII 中,每个字符都需要一个字节。
1赞 Akina 11/14/2023
dbfiddle.uk/Z7fV3ovQ

答:

1赞 Ergest Basha 11/13/2023 #1

正如 Shadow 在评论中提到的,这是一个 8 位数字,而不是 8 字节数字。

如果你的字符串总是有以下格式,你可以使用 substring_index 函数

链接:https://www.old_example1.com/12345678/myname 链接:https://www.old_example2.com/87654321/yourname

我用作单词来获取字符串的最新部分,包括替换的部分。我猜在你的字符串中只重复一次,否则这个答案会失败。.com/.com/

SELECT SUBSTRING_INDEX(col,'.com/',-1) AS extracted
FROM test;

结果

extracted
12345678/myname
87654321/yourname

与上面相同的事情来获取数字并且不包括两次/

select concat('/',SUBSTRING_INDEX(SUBSTRING_INDEX(col,'.com/',-1),'/',1)) as value_to_replace
FROM test;

结果

value_to_replace
/12345678
/87654321

最后

select col,replace(col,concat('/',SUBSTRING_INDEX(SUBSTRING_INDEX(col,'.com/',-1),'/',1)),'') as new_col
from test;

结果

col new_col
https://www.old_example1.com/12345678/myname    https://www.old_example1.com/myname
https://www.old_example2.com/87654321/yourname  https://www.old_example2.com/yourname

查看示例


评论

0赞 Ubuntubasic1864 11/14/2023
感谢 @Ergest Barsha(和 Shadow)指出字节和数字的区别。对于混乱,我深表歉意。事实上,子字符串索引出现在我的脑海中,但鉴于 url 位于文本帖子的正文中,我不确定。使用 concat,这看起来像是我问题的解决方案。谢谢一堆!
0赞 user1191247 11/14/2023 #2

您可以使用 REGEXP_REPLACE()。

下面是一个粗略的例子:

SET @string = 'Some text https://www.old_example1.com/12345678/myname blah blah blah https://www.old_example2.com/87654321/yourname some more blah';

SELECT
    @string AS old_string,
    REGEXP_REPLACE(
        @string,
        'https:\/\/www\.old_example([1|2])\.com(\/[0-9]{8}\/)',
        'https://www.new_example$1.com/'
    ) AS new_string;

输出:

old_string new_string
一些文字 https://www.old_example1.com/12345678/myname 等等等等 https://www.old_example2.com/87654321/yourname 再多一些等等 一些文字 https://www.new_example1.com/myname 等等等等 https://www.new_example2.com/yourname 再多一些等等

这是一个 db<>fiddle

评论

0赞 Ubuntubasic1864 11/14/2023
REGEXP 看起来更整洁!
1赞 Ubuntubasic1864 11/14/2023
我最终用上面的通配符类型网址解决了我的难题。它帮助我更轻松地处理其他类似案件。谢谢一堆!
1赞 Ubuntubasic1864 11/15/2023
同样的请求是针对单个事件的,但我的服务器中也有类似的情况,所以我不得不手动应用修改后的情况。目前,对服务器问题的响应数量有限,但后来,如果它们经常这样,我必须添加即时转换的行。