【问题标题】:Does the MySQL TRIM function not trim line breaks or carriage returns?MySQL TRIM 函数是否不修剪换行符或回车符?
【发布时间】:2010-09-21 20:33:20
【问题描述】:

从我的实验来看,它似乎没有这样做。如果这确实是真的,那么删除换行符的最佳方法是什么?我目前正在试验 TRIM 接受要删除的字符的参数,从修剪 \n\r 开始。

【问题讨论】:

    标签: mysql string trim


    【解决方案1】:

    我的换行符位于字符串的中间,我无法控制源数据。以下 mysql 命令对我有用:

    REPLACE(FIELD,'\r\n',' ')
    

    【讨论】:

    • 对我有用,我只需要 \n 而不是 \r\n
    • 这是最受欢迎的解决方案,但会删除所有个换行符,不仅在开头和结尾。
    【解决方案2】:

    是的,Trim() 可以在 MySQL 中使用。你有两个选择。

    1) 选择它:

    select trim(BOTH '\n' from [field_name]) as field
    

    如果不行,试试'\r',如果不行,试试'\n\r'

    2) 用更新替换表中的错误数据...

    update [table_name] set [field_name] = trim(BOTH '\n' from [field_name])
    

    我建议先进行选择以确定您有哪个换行符(\r 或 \n)。

    【讨论】:

    • 这对我没有帮助(我尝试了所有 3 种组合),我必须使用 PHP trim() 才能真正做到这一点。
    【解决方案3】:

    标准的 MySQL trim 函数与我知道的任何其他语言中的修剪函数不同,因为它只删除完全匹配的字符串,而不是字符串中的任何字符。这个存储的函数更像是你在 PHP 中找到的普通修剪,或者在 python 等中删除。

    CREATE FUNCTION `multiTrim`(string varchar(1023),remove varchar(63)) RETURNS varchar(1023) CHARSET utf8
    BEGIN
      -- Remove trailing chars
      WHILE length(string)>0 and remove LIKE concat('%',substring(string,-1),'%') DO
        set string = substring(string,1,length(string)-1);
      END WHILE;
    
      -- Remove leading chars
      WHILE length(string)>0 and remove LIKE concat('%',left(string,1),'%') DO
        set string = substring(string,2);
      END WHILE;
    
      RETURN string;
    END;
    

    你应该能够做到:

    select multiTrim(string,"\r\n\t ");
    

    它应该删除所有换行符、制表符和空格。

    【讨论】:

    • 我很着急,我没有时间正确测试或分析原始函数,所以我不会直接编辑你的答案,但是当字符串最初由几个空格组成时,换行符和制表符 only,返回原始字符串。我终于在函数的开头添加了IF string REGEXP '^[[:space:]]*$' THEN set string = ''; ELSE ...。你怎么看?你能复制吗?
    • @Áxel 问题是mysql看到空字符串与所有空白字符串相同,即"" = " "返回true!所以我的while string<>"" 应该捕获被删除字符串的最后一个字符,如果字符串全是空格,则实际上会导致整个内容被跳过。
    • @Áxel 我已经通过测试字符串的长度来修复它,而不是与“”相等。
    • 我不能相信它。好点@rjmunro,非常感谢。
    • 当字符串包含 'ë' '€' 等 utf8 特殊字符时,此 multitrim 函数似乎不起作用。
    【解决方案4】:

    如果select trim(both '\n' from FIELDNAME) from TABLE; 不起作用,select trim(both '\r\n' from FIELDNAME) from TABLE; 应该起作用。

    【讨论】:

      【解决方案5】:

      Trim() 在 MySQL 中只删除空格。

      我不相信有一种内置的方法可以删除 MySQL 中的各种尾随和前导空格,除非你反复使用Trim()

      我建议您使用另一种语言来清理您当前的数据,并确保从现在开始对您的输入进行清理。

      【讨论】:

      • 是的,新输入已被清理,但处理旧数据......嗯......不好玩。
      • 哈,当然。但是如果你有一个不能有尾随或前导空格的字段列表,你应该能够编写一个一次性程序来修复你当前的数据——99% 的编程语言都有一个 Trim()会做你正在寻找的。​​span>
      • 这不是正确的答案。使用trim(both char(10) from content) 和/或trim(both char(13) from content),就像下面几个人提到的那样。
      【解决方案6】:

      我只能通过 char 来让它工作;

      trim(both char(13) from fieldname)
      

      【讨论】:

        【解决方案7】:
        select trim(both '\n' from FIELDNAME) from TABLE;
        

        【讨论】:

        • 这不起作用,因为它看起来 MySQL 中的换行符不是 \n。
        【解决方案8】:

        上面的答案,当结合起来,工作。在字段的开头和结尾替换换行符的完整示例如下所示:

        UPDATE table SET field=REPLACE(field, field, TRIM(BOTH '\r\n' FROM field))
        

        【讨论】:

          【解决方案9】:

          我在其中一个领域遇到了同样的问题。没有完美的解决方案。就我而言,我很幸运该字段的长度应该是 6。所以我使用了类似的查询

          update events set eventuniqueid = substring(eventuniqueid, 1, 6) where length(eventuniqueid) = 7;
          

          您只需根据需要选择最佳选项。替换 '\n' 和 '\r\n' 对我不起作用,最终浪费了我的时间。

          【讨论】:

            【解决方案10】:

            REPLACE(FIELD,'\r\n',' ') 在 MySql 5.1 数据库上完美运行

            【讨论】:

            • 如果您只想删除前导或尾随中断,正如问题中使用 TRIM() 所暗示的那样,这可能会严重混淆您的数据。
            猜你喜欢
            • 1970-01-01
            • 2021-07-05
            • 1970-01-01
            • 2023-02-21
            • 2015-04-06
            • 2016-05-23
            • 2013-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多