SQL Server里头怎么把那些多余的空格给去掉,弄得数据干净点好用点
- 问答
- 2026-01-25 05:54:34
- 1
直接说SQL Server里怎么把多余空格去掉,这活儿主要用几个内置的函数,根据空格的位置和多少,选不同的方法,下面我按常见的几种情况分开说,你对照着自己的数据来用就行。

第一种,也是最常见的:去掉字符串开头和结尾的空格。 就是数据录入时,不小心在词前面或后面多敲了几个空格,SQL Server 2017及以后的版本,有个最省事的函数叫 TRIM(),你直接写 SELECT TRIM(列名) FROM 表名,它就会把指定列里每行数据开头和结尾的空格都削掉,只留中间的内容,这个函数是微软官方文档里明确提供的字符串函数(来源:Microsoft SQL Server 官方文档,字符串函数部分),如果你用的版本比较老(比如SQL Server 2016或更早),那就得用两个老函数组合:LTRIM() 和 RTRIM()。LTRIM() 专门去开头的空格,RTRIM() 专门去结尾的空格,通常是一起用,写成 SELECT LTRIM(RTRIM(列名)) FROM 表名,效果和新的 TRIM() 一样。

第二种,字符串中间有多余的空格。 北京 海淀区”这种词中间空了好几个格,你只想留一个,这个 TRIM() 函数就管不了了,因为它只处理两头,这时候得用 REPLACE() 函数,但 REPLACE() 本身是“一个换一个”,没法直接“多个换一个”,所以得动点脑筋:我们可以先用 REPLACE() 把所有的空格(不管一个还是多个)都先替换成一个特殊的、数据里肯定不会出现的字符(,然后再把这个特殊字符换回成单个空格,听起来绕,其实一句SQL就能写:SELECT REPLACE(REPLACE(REPLACE(列名, ' ', '##'), '##', ' '), ' ', ' ') FROM 表名,这句的意思分三步:第一步,把原字符串里所有空格变成;第二步,把所有变回成一个空格;但这时候可能第一步会产生连续的空格,所以第三步再来一次把所有连续两个空格替换成一个空格(可能需要重复执行几次直到没有连续两个空格为止),更常见的做法是借助循环或者写一个用户自定义函数来更干净地处理中间的多余空格,但如果你不想搞那么复杂,这个替换的思路在不少论坛的讨论里都能看到(来源:如Stack Overflow社区中关于移除多余空格的讨论)。

第三种,去掉所有空格,包括中间的空格。 如果你想把空格彻底消灭,比如把“身份证号码”里误输入的空格全拿掉,那就简单了,直接用 REPLACE(列名, ' ', ''),把空格替换成空字符串,这样无论空格在哪儿,都会被删光。
第四种,对付那些“看不见”的空白字符。 有时候你看着像空格,但用普通方法去不掉,那可能它不是普通的空格(ASCII 32),而是制表符(Tab)、换行符或者其他空白字符,这时候可以试试用嵌套的 REPLACE,先去掉制表符:REPLACE(列名, CHAR(9), '');再去掉换行符:REPLACE(上面处理过的结果, CHAR(10), '');再去掉回车符:REPLACE(上面处理过的结果, CHAR(13), '')。CHAR()函数能根据ASCII码生成字符,数字9、10、13分别对应制表符、换行符和回车符(来源:Microsoft SQL Server 官方文档,CHAR函数部分),把这些都替换掉之后,最后再用 TRIM() 或者 LTRIM(RTRIM()) 处理一下普通的空格,就非常干净了。
重要提醒: 上面这些 SELECT 语句都只是查询看看效果,不会改变你表里原来的数据,如果你觉得效果对了,想永久地把数据清理干净,就得用 UPDATE 语句,比如要永久去掉头尾空格,就写:UPDATE 表名 SET 列名 = LTRIM(RTRIM(列名))。千万记得,动手更新前最好备份一下数据,或者先SELECT出来看看,确认无误再跑UPDATE,不然改错了恢复起来很麻烦。
空格问题有时比想的复杂,有些空格可能是全角空格(中文输入法下的空格),这和普通的半角空格(英文输入法下的)在数据库里是不同的字符,上面的方法主要针对半角空格,如果怀疑有全角空格,可以试试用 REPLACE(列名, N' ', '') 来替换(注意引号里的全角空格),处理数据没有一劳永逸的万能药,最好先仔细看看你的数据里多余的空格到底是哪种,再选最合适的方法,多试试 SELECT 不同函数组合的效果,直到看起来“顺眼”了为止。
本文由钊智敏于2026-01-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/85548.html
