【问题标题】:MySQL : how to remove double or more spaces from a string?MySQL:如何从字符串中删除双倍或更多空格?
【发布时间】:2011-08-04 11:30:32
【问题描述】:

我找不到 MySQL 的这个问题,所以这里是:

我需要将字符串中的所有双空格或多个空格修剪为 1 个单空格。

例如: “快速的棕色狐狸” 应该 : “迅捷的棕狐”

函数REPLACE(str, "  ", " ") 只去除双空格,但有更多空格时留下多个空格...

【问题讨论】:

标签: mysql string


【解决方案1】:

这是一个不需要正则表达式或复杂函数的老技巧。

您可以使用替换功能 3 次来处理任意数量的空格,如下所示:

REPLACE('This is    my   long    string',' ','<>')

变成:

This<>is<><><><>my<><><>long<><><><>string

然后将所有出现的 '>

REPLACE(
  REPLACE('This is    my   long    string',' ','<>'),
    '><',''
)

This<>is<>my<>long<>string

最后最后一个替换将''转换回单个空格

REPLACE(
  REPLACE(
    REPLACE('This is    my   long    string',
      ' ','<>'),
    '><',''),
  '<>',' ')

This is my long string

此示例是在 MYSQL 中创建的(在前面放置一个 SELECT),但适用于多种语言。

请注意,您只需要 3 个替换函数来处理要替换的任意数量的字符。

【讨论】:

  • 聪明的答案,但与存储的函数相比,它非常难以阅读。
  • 你摇滚!很好的解决方案。
  • 我喜欢这个解决方案:它既简单又富有创意。我个人喜欢在三个单独的查询中执行此示例中的替换功能,而不是在替换中替换替换。
  • 如果您的字符串包含这些字符之一,这显然不起作用。 my &gt; string 变为 my &gt;string
  • 啊哈我喜欢这个小魔术:)
【解决方案2】:

最短且令人惊讶的是最快的解决方案:

CREATE FUNCTION clean_spaces(str VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    while instr(str, '  ') > 0 do
        set str := replace(str, '  ', ' ');
    end while;
    return trim(str);
END

【讨论】:

    【解决方案3】:

    我知道这个问题是用 mysql 标记的,但如果你有幸使用 MariaDB,你可以更轻松地做到这一点:

    SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');
    

    【讨论】:

    • 不适合我:REGEXP_REPLACE(LCASE(metapackages->>'$.data[0].title'), '[[:space:]]+', ' ')
    • 如果你有幸使用 mysql 8 这也可以
    • 聪明而简单的答案,太好了!
    • 与涉及 REPLACE() 的解决方案不同,这个解决方案还处理其他空白字符 - 空格、制表符、换行符和回车。
    【解决方案4】:
    DELIMITER //
    
    DROP FUNCTION IF EXISTS DELETE_DOUBLE_SPACES//
    CREATE FUNCTION DELETE_DOUBLE_SPACES ( title VARCHAR(250) )
    RETURNS VARCHAR(250) DETERMINISTIC
    BEGIN
        DECLARE result VARCHAR(250);
        SET result = REPLACE( title, '  ', ' ' );
        WHILE (result <> title) DO 
            SET title = result;
            SET result = REPLACE( title, '  ', ' ' );
        END WHILE;
        RETURN result;
    END//
    DELIMITER ;
    
    SELECT DELETE_DOUBLE_SPACES('a    b');
    

    【讨论】:

    • 超级!作品。谢谢!
    • 呜呜呜呜呜!谢谢
    【解决方案5】:

    这个解决方案不是很优雅,但是因为你没有任何其他选择:

    UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, "  ", " " ), "  ", " " ), "  ", " " );
    

    【讨论】:

    • 是的 SELECT REPLACE( REPLACE( "a[5 spaces]b", " ", " " ), " ", " " )' 结果:"a b"
    • 不行,试试SELECT length(REPLACE( REPLACE( "a b", " ", " " ), " ", " " ));,它返回4而不是3
    • @ajreal 好吧,看来你是对的,你做的嵌套越多,它可以处理的空间就越多,但必须有办法让它工作,我会继续思考
    • haha ... 干得好,但是如果空格超过 6 个就会失败,当空格超过 2 个时,你只需要一个 WHILE 循环,但是,mysql 并不真正支持 WHILE 循环,如前所述,定义你的过程函数来做到这一点
    • 看起来没有办法使这项工作,编辑并改变了我回答的基调:)
    【解决方案6】:

    搜索后我最终编写了一个函数,即

    如果存在 trim_spaces,则删除函数;

    delimiter $$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `trim_spaces`(`dirty_string` text, `trimChar` varchar(1))
        RETURNS text
        LANGUAGE SQL
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN
      declare cnt,len int(11) ;
      declare clean_string text;
      declare chr,lst varchar(1);
    
      set len=length(dirty_string);
      set cnt=1;  
      set clean_string='';
    
     while cnt <= len do
          set  chr=right(left(dirty_string,cnt),1);           
    
          if  chr <> trimChar OR (chr=trimChar AND lst <> trimChar ) then  
              set  clean_string =concat(clean_string,chr);
          set  lst=chr;     
         end if;
    
         set cnt=cnt+1;  
      end while;
    
      return clean_string;
    END
    $$
    delimiter ;
    

    用法:

    set @str='------apple--------banana-------------orange---' ;

    select trim_spaces( @str,'-')

    输出:apple-banana-orange-

    参数trimChar 可以由任何重复且您想要删除的字符来运行。

    注意它会在重复集中保留第一个字符

    干杯:)

    【讨论】:

    • 这么好的功能...恭喜
    【解决方案7】:

    对于 MySQL 8+,可以使用REGEXP_REPLACE 函数:

    UPDATE `your_table` 
    SET `col_to_change`= REGEXP_REPLACE(col_to_change, '[[:space:]]+', ' ');
    

    【讨论】:

    • MySQL 8+的完美解决方案
    【解决方案8】:

    这是一个稍微通用的解决方案:来自

    http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=56195&whichpage=1

    create table t (s sysname)
    insert into t select 'The   Quick  Brown    Fox'
    -- convert tabs to spaces
    update  t set s = replace(s, '  ',' ')
    where   charindex(' ', s) > 0
    
    -- now do the work.
    while 1=1
    begin
        update t
        set     s = substring(s, 1, charindex('  ', s, 1)-1) + ' ' + ltrim(substring(s,charindex('  ', s, 1), 8000))
        where   charindex('  ', s, 1) > 0
    
        if @@rowcount = 0
            break
    end
    
    select  s
    from    t
    

    【讨论】:

      【解决方案9】:

      如果您要转换的字符串仅包含字母和多个空格 [A-Za-z ]*,则以下函数将起作用。当这些字符串转换为十六进制时,我发现了一种模式。基于此,我的解决方案如下。不是那么优雅,但它不需要任何程序。

      unhex(
      replace(
      replace(
      replace(
      replace(
      replace(
      replace(
      hex(str)
      ,204,1014)
      ,205,1015)
      ,206,1016)
      ,207,1017)
      ,20,'')
      ,101,20)
      )
      

      【讨论】:

        【解决方案10】:

        如果你使用的是 php....

        try{
        $con = new PDO ("mysql:host=localhost;dbname=dbasename","root","");
        }
        catch(PDOException $e){
        echo "error".$e-getMessage();   
        }
        
        $select = $con->prepare("SELECT * FROM table");
        $select->setFetchMode(PDO::FETCH_ASSOC);
        $select->execute();
        
        while($data=$select->fetch()){ 
        
        $id = $data['id'];
        $column = $data['column'];
        
        $column = trim(preg_replace('/\s+/',' ', $column)); // remove all extra space
        
        
        $update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
        $update->bindParam(':column', $column );
        $update->execute();
        
        // echo $column."<br>";
        } 
        

        【讨论】:

          【解决方案11】:

          按照我为 MySQL 5.6 制作的通用函数。我的意图是使用正则表达式来识别空格,CR 和 LF,但是,这个版本的 mysql 不支持它。所以,我不得不遍历字符串来寻找字符。

          CREATE DEFINER=`db_xpto`@`%` FUNCTION `trim_spaces_and_crlf_entire_string`(`StringSuja` text) RETURNS text CHARSET utf8     COLLATE utf8_unicode_ci
          DETERMINISTIC
          BEGIN
          DECLARE StringLimpa TEXT;
          DECLARE CaracterAtual, CaracterAnterior TEXT;
          DECLARE Contador, TamanhoStringSuja INT;
          
          SET StringLimpa = '';
          SET CaracterAtual = '';
          SET CaracterAnterior = '';
          SET TamanhoStringSuja = LENGTH(StringSuja);
          SET Contador = 1;
          
          WHILE Contador <= TamanhoStringSuja DO
              SET CaracterAtual = SUBSTRING(StringSuja, Contador, 1);
          
              IF ( CaracterAtual = ' ' AND CaracterAnterior = ' ' ) OR CaracterAtual = '\n' OR CaracterAtual = '\r' THEN
                  /* DO NOTHING */
                  SET Contador = Contador;
                  /* TORNA OS ESPAÇOS DUPLICADOS, CR, LF VISUALIZÁVEIS NO RESULTADO (DEBUG)
                  IF ( CaracterAtual = ' ' ) THEN SET StringLimpa = CONCAT(StringLimpa, '*');END IF;
                  IF ( CaracterAtual = '\n' ) THEN SET StringLimpa = CONCAT(StringLimpa, '\\N');END IF;
                  IF ( CaracterAtual = '\r' ) THEN SET StringLimpa = CONCAT(StringLimpa, '\\R');END IF;
                  */
              ELSE
                  /* COPIA CARACTER ATUAL PARA A STRING A FIM DE RECONSTRUÍ-LA SEM OS ESPAÇOS DUPLICADOS */
                  SET StringLimpa = CONCAT(StringLimpa, CaracterAtual);
                  /*SET StringLimpa = CONCAT(StringLimpa, Contador, CaracterAtual);*/
                  SET CaracterAnterior = CaracterAtual;
              END IF;
          
              SET Contador = Contador + 1;
          END WHILE;
          
          RETURN StringLimpa;
          END
          

          【讨论】:

            【解决方案12】:

            在 MySQL 8+ 中:

            SELECT REGEXP_REPLACE(str, '\\s+', ' ');
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-04
              • 1970-01-01
              • 2020-02-02
              • 1970-01-01
              • 2011-08-05
              相关资源
              最近更新 更多