TRIM 是什么
TRIM 去掉字符串两端的空白字符,LTRIM 与 RTRIM 分别只处理左侧与右侧。两库语法基本一致:TRIM(str) 去掉两端空格,TRIM(LEADING|TRAILING|BOTH 字符 FROM str) 可指定要去掉的字符。需要注意 TRIM 默认只处理半角空格,制表符、换行与不换行空格不会被去掉,清洗用户输入时通常还要配合 REPLACE 处理这些字符。对列做 TRIM 后再比较会让该列索引失效。
基本信息
| TRIM(str) | 去掉两端半角空格 |
|---|---|
| LTRIM / RTRIM | 只去左侧或只去右侧 |
| 指定字符 | TRIM(BOTH 'x' FROM str) 可指定要去掉的字符 |
| 默认范围 | 仅半角空格,不含制表符与不换行空格 |
| 索引影响 | 对列 TRIM 后比较会使该列索引失效 |
| 适用平台 | 标准语法,MySQL 8.0 与 PostgreSQL 均支持 |
典型使用场景
- 清洗用户输入:注册与导入时去掉首尾空格
- 修复历史数据:统一修正带空格的编码与名称
- 比对去重:先规范化再比较,避免空格造成的假重复
- 导入前置处理:去掉 CSV 字段两侧的不可见字符
- 拼接前整理:避免多余空格影响展示
- 唯一约束校验:规范化后判断是否真的重复
示例
示例
SELECT TRIM(' hello ') AS a, # hello
LTRIM(' hello ') AS b, # 只去左侧
RTRIM(' hello ') AS c, # 只去右侧
TRIM(BOTH '-' FROM '-abc-') AS d; # 去掉两端的 -
-- 清洗后写回:先确认影响行数,再更新
SELECT COUNT(*) FROM users WHERE name <> TRIM(name);
UPDATE users SET name = TRIM(name) WHERE name <> TRIM(name);
-- 处理制表符与不换行空格:TRIM 默认不管这些字符
SELECT REPLACE(REPLACE(name, CHAR(9), ''), CHAR(160), '') FROM users;函数与范围
| 写法 | 去掉内容 | 注意 |
|---|---|---|
| TRIM(str) | 两端半角空格 | 不含制表符、换行、不换行空格 |
| LTRIM(str) | 左侧空格 | 右侧保留 |
| RTRIM(str) | 右侧空格 | 左侧保留 |
| TRIM(BOTH x FROM str) | 两端指定字符 | x 可以是任意单字符 |
| REPLACE(str, …, '') | 任意位置的字符 | 用于清理隐藏字符 |
清洗前先统计有多少行需要修改:SELECT COUNT(*) FROM 表 WHERE 列 <> TRIM(列),据此评估影响范围与执行时间。
在 WHERE 中对列使用 TRIM 会让索引失效;数据清洗类批量操作可以接受,但常规查询应保持列裸比较。
把去空格逻辑放在业务查询里临时处理,会掩盖数据质量问题;更稳的做法是在写入入口就做规范化,或加触发器与约束。
使用要点
- 清洗时同时考虑制表符、换行与不换行空格
- 批量更新前先统计影响行数并备份
- 唯一键冲突排查时先规范化再比较
- 应用层与数据库层选一层做规范化,避免重复处理
- 清洗后回归验证:随机抽样比对清理前后的值
- 把规范化规则写进数据接入规范,从源头减少脏数据