【问题标题】:MySQL: trim *both* whitespace and newline charactersMySQL:修剪 *both* 空格和换行符
【发布时间】:2015-04-06 18:33:31
【问题描述】:

我有一个文本列,其内容在字符串的前后混合了换行符和空白字符。我正在尝试写一个SELECT 声明,它向我展示了没有前导和尾随垃圾的内容。

以下查询修剪空格:

SELECT TRIM(column)
FROM table;

虽然这个修剪换行符:

SELECT TRIM('\n' FROM column)
FROM table;

我也尝试过this answer,但它不起作用:

SELECT TRIM(BOTH '\t' OR '\n' FROM TRIM(BOTH '\n' OR '\t' FROM TRIM(column)))
FROM table;

有没有办法消除前导字符和尾随字符的混合?

更新:我无法替换,因为我仍然希望空白/换行符出现在内容中。

我有一些带有空格的字段,后跟一堆换行符,然后是更多的空格/换行符。因此进退两难。

【问题讨论】:

  • 不知道为什么当 cmets 表明它已损坏时,您为什么要费心尝试该答案。
  • 所以要绝对清楚,您的字段看起来像:(1)一堆空白和新行的前言,然后是(2)实际内容,其中可能有更多空白和换行符,然后是(3)尾随空格和换行符?而你想删除 (1) 和 (3)>
  • 完全正确。

标签: mysql trim


【解决方案1】:

很遗憾,TRIM(BOTH '\n' OR '\r' FROM myfield) 无法正常工作。所以下面的代码只修剪一个换行符 (\r\n) 语句,而不是多个:

SELECT TRIM(TRIM(BOTH '\n' FROM(TRIM(BOTH '\r' FROM myfield)))) FROM mytable

请注意,上面的语句不会将<space>\r\n mytext 修剪为mytext,因为\r\n 不在开头。

MariaDB 解决方案

如果您使用 MariaDB (https://mariadb.com/kb/en/mariadb/pcre/),您可以使用正则表达式来解决您的问题。以下表达式从文本中删除所有空白前缀:

SELECT REGEXP_REPLACE(myfield, '^[\r\n ]*(.*)', '\\1') FROM mytable

【讨论】:

    【解决方案2】:

    另一种方法是将 '\n' 替换为空字符串,然后对其进行修剪。代码如下:

    SELECT TRIM(REPLACE(column, '\n','' )) from table;
    

    或者,您可以根据需要调用两次 trim。

    SELECT TRIM(TRIM('\n' FROM column)) from table;
    

    【讨论】:

    • 我不能REPLACE,因为我仍然希望空格/换行符出现在内容内部时。 SELECT TRIM(TRIM('\n' FROM column)) from table; 不起作用,因为我有一些带有空格的字段,后跟一堆换行符,随后是更多的空格。因此进退两难。
    【解决方案3】:

    最终在 Ruby 中完成:

    def process_text(text)
      if text
        text.force_encoding('UTF-8')
        .gsub(/((\.\s)|\.|\u2026){4,}/, '...') # shorten multiple dots (or ellipsis) to 3 dots
        .gsub(/((\-\s)|\-){4,}/, '---') # shorten multiple dashes to 3 dashes
        .gsub(/((\_\s)|\_){4,}/, '___') # shorten multiple underscores to 3 underscores
        .gsub(/\p{Sm}|\u2022|\u2023/, ' ') # remove bullets
        .gsub(/[^[[:alnum:]] | \p{Sc} | \p{Cc} | [[:punct:]]]/, ' ') # preserve accented letters and currency signs
        .gsub(/^(\v|\f|\n|\t|\s|\u2029){3,}/, "\n")
        .strip
      end
    end
    

    【讨论】:

      【解决方案4】:

      以下查询将有助于删除mysql列数据中的回车符(换行符)

      使用换行符的 ASCII 值,我可以用任何内容替换它

      select replace(col_name, CHAR(13),'' ) from table;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 1970-01-01
        相关资源
        最近更新 更多