如何删除MySQL字段中的前导和尾随空格?

KB.*_*KB. 122 mysql field removing-whitespace

我有一个包含两个字段的表(国家和ISO代码):

Table1

   field1 - e.g. 'Afghanistan' (without quotes)
   field2 - e.g. 'AF'(without quotes)
Run Code Online (Sandbox Code Playgroud)

在某些行中,第二个字段在开头和/或结尾处有空格,这会影响查询.

Table1

   field1 - e.g. 'Afghanistan' (without quotes) 
   field2 - e.g. ' AF' (without quotes but with that space in front)
Run Code Online (Sandbox Code Playgroud)

是否有一种方法(在SQL中)通过表并查找/替换field2中的空格?

cwa*_*ole 252

你正在寻找TRIM.

UPDATE FOO set FIELD2 = TRIM(FIELD2);
Run Code Online (Sandbox Code Playgroud)

  • 是的,你是对的@TM所以最好使用:UPDATE FOO设置FIELD2 = TRIM(替换(替换(替换(FIELD2,'\ t',''),'\n',''),'\ r' , '')); 等等 (29认同)
  • 注意:这只删除常规空格而不删除其他空格字符(制表符,换行符等) (16认同)
  • 虽然@ChrisSim的解决方案也将取代内容中的换行符和标签,当然 - 这可能不是大多数人想要的TRIM功能! (6认同)

Chr*_*Sim 36

我从你的答案和其他链接组成的一般答案,它对我有用,我在评论中写道:

 UPDATE FOO set FIELD2 = TRIM(Replace(Replace(Replace(FIELD2,'\t',''),'\n',''),'\r',''));
Run Code Online (Sandbox Code Playgroud)

等等

因为trim()不会删除所有的空格,所以最好更换所需的所有空白区域,然后修剪它.

希望我能帮助你分享我的答案:)

  • 这将删除所有标签/换行符.TRIM应该只删除字符串两端的空格. (7认同)
  • 这是一个思考和删除新行字符的好主意,谢谢,就像一个魅力,我已经投票了,因为这个想法@Chris Sim (2认同)

ami*_*jer 23

在使用此解决方案之前,请先了解用例:

在执行选择查询时,trim不起作用

这有效

select replace(name , ' ','') from test;
Run Code Online (Sandbox Code Playgroud)

虽然这不是

select trim(name) from test;
Run Code Online (Sandbox Code Playgroud)

  • 修剪在执行选择查询时适合我. (16认同)
  • 是的,这个答案是错误的.这是如何得到50多个upvotes? (10认同)
  • `TRIM()`在'SELECT`语句中对我来说很好用,我真的很好奇为什么这个答案有这么多的赞成.你在用mysql吗?什么版本? (8认同)
  • 我投了反对票。测试用例: `SELECT CONCAT('"', TRIM(" hello world "), '"') AS \`trimmed value\` FROM DUAL` 给出所需的输出 `"hello world"`。虽然替换变体危险地删除了作为单词分隔符的空格: `SELECT CONCAT('"', REPLACE(" hello world ", ' ', '')) AS \`replaced value\` FROM DUAL` 给出了不需要的输出 `"你好世界”` (4认同)
  • 这不仅是错误的,而且是危险的.它可以严重污染某人的数据. (3认同)

mul*_*lya 16

为了清楚起见,TRIM默认只删除空格(不是所有空格).这是doc:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim

  • 这应该作为评论添加. (12认同)

Ste*_*ers 9

似乎当前的答案中没有一个实际上会从字符串的开头和结尾删除100%的空格.

正如其他帖子中所提到的,默认情况下TRIM只删除空格 - 而不是制表符,换页等TRIM.指定其他空白字符的s 组合可能会提供有限的改进,例如TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt))))).但是这种方法的问题是只能为特定TRIM字符指定单个字符,并且这些字符仅从开头和结尾删除.因此,如果被修剪的字符串是类似的\t \t \t \t(即替代空格和制表符),则TRIM需要更多的s - 并且在一般情况下,这可以无限期地继续.

对于轻量级解决方案,应该可以通过循环字符串开头和结尾处的字符来编写一个简单的用户定义函数(UDF)来完成工作.但是我不打算这样做...因为我已经写了一个更重量级的正则表达式替换器,它也可以完成这项工作 - 并且可能因其他原因而有用,如本博文中所述.

演示

Rextester在线演示.特别是,最后一行显示其他方法失败但正则表达式方法成功.

SQL (为简洁省略了功能代码)

SELECT reg_replace(
         reg_replace(txt,
                     '^[[:space:]]+',
                     '',
                     TRUE,
                     1,
                     0),
         '[[:space:]]+$',
         '',
         TRUE,
         1,
         0) AS `trimmed txt`
FROM tbl;
Run Code Online (Sandbox Code Playgroud)