【问题标题】:String split in MySQL using REPLACE and SUBSTRING_INDEXMySQL 中使用 REPLACE 和 SUBSTRING_INDEX 拆分字符串
【发布时间】:2025-12-05 23:40:02
【问题描述】:

我需要拆分这个:

a:6:{s:8:"address1";s:11:"2 Bourke St";s:8:"address2";s:13:"Woolloomooloo";s:4:"city";s:6:"Sydney";s:5:"state";s:3:"NSW";s:11:"postal_code";s:4:"2011";s:7:"country";s:9:"Australia";}

通过; 提取字符串末尾附近的值2011。即使退出s:4:"2011" 也可以。

我目前正在使用此代码:

REPLACE(SUBSTRING_INDEX(address, ';', 10), LENGTH(SUBSTRING_INDEX(address, ';', 10 -1)) + 1), ';', '')

我从一个将它列为在 MySQL 中拆分字符串的解决方案的网站上得到它......但它有语法错误。我尝试调试它,发现) 太多了,但我无法弄清楚如何更改它以使其正常工作......我对这应该如何拆分字符串缺乏了解。

this solution相比,它似乎过于复杂...

谁能提供帮助?对其工作原理的解释会很好,或者替代解决方案也可以。

谢谢!

【问题讨论】:

    标签: mysql sql substring string-split


    【解决方案1】:

    阅读SUBSTRING_INDEXREPLACE 的文档,您会更清楚代码的作用。

    请注意,SUBSTRING_INDEX(address,';',10) 检索所有address 直到; 的第 10 次出现,因此在您的情况下,从字符串的开头到s:4:"2011"

    REPLACE(string,from,to) 将所有出现的from 替换为to。看起来您尝试的代码正在尝试替换所有内容,直到第 9 个 ';'什么都没有(通过REPLACE),并且在第10个';'之后也切断了一切。这将留下 's:4:"2011"'。

    提取s:4:"2011" 的一种方法是使用SUBSTRING_INDEX(address,';',-4),它返回倒数第四个; 之后的所有内容。在你的情况下,那将是s:4:"2011";s:7:"country";s:9:"Australia";}

    然后,在此结果字符串上使用SUBSTRING_INDEX(...,';',1) 以获取; 第一次出现之前的所有内容,即s:4:"2011"

    总结:

    SUBSTRING_INDEX(SUBSTRING_INDEX(address,';',-4),';',1)
    

    我相信还有其他方法可以做到这一点。

    【讨论】:

      【解决方案2】:

      应该这样做 -

      SET @a := 'a:6:{s:8:"address1";s:11:"2 Bourke St";s:8:"address2";s:13:"Woolloomooloo";s:4:"city";s:6:"Sydney";s:5:"state";s:3:"NSW";s:11:"postal_code";s:4:"2011";s:7:"country";s:9:"Australia";}';
      SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@a, ';', -4), ';', 1);
      

      【讨论】: