不能。replace(col, ' ', '')仅删除ascii空格(u+0020),对制表符( )、换行符( )、全角空格(u+3000)、零宽空格(u+200b)等均无效,需用嵌套replace、translate或正则函数处理。

SQL里用REPLACE去掉字段所有空格,真的能忽略所有“空格”吗?
不能。默认的 REPLACE(col, ' ', '') 只删半角空格(ASCII 32),对制表符( )、换行符(
、
)、全角空格(U+3000)完全无效——这些在真实数据中极常见,尤其从Excel、网页或用户输入导入时。
常见错误现象:REPLACE(name, ' ', '') = '张三' 查不到实际值为 '张 三'(含全角空格)或 '张三
' 的记录。
- 先确认空格类型:用
SELECT DUMP(col, 1016) FROM t WHERE ...(Oracle)或SELECT ASCII(SUBSTRING(col, pos, 1))(MySQL/SQL Server)逐字节查编码 - MySQL/PostgreSQL建议用正则:如
REGEXP_REPLACE(col, '[[:space:]]', '')或更稳妥的REGEXP_REPLACE(col, 's+', '') - SQL Server 2017+ 支持
TRANSLATE(col, CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32), '')一次性替换常见空白符
MySQL中REPLACE链式调用是否可靠?
可以,但写法冗长且易漏。比如想清空所有空白字符,得写成:REPLACE(REPLACE(REPLACE(REPLACE(col, ' ', ''), ' ', ''), '
', ''), '
', '')。
性能影响明显:每层 REPLACE 都触发一次全字段扫描和重建,字段越长、嵌套越多,CPU和内存开销越大。
- 优先用
REGEXP_REPLACE(col, '\s+', '')(MySQL 8.0+),语义清晰、一次匹配 - 若必须兼容老版本,把最常出现的空白符放最外层,比如先删
' '再删' ',减少内层处理长度 - 注意:
REGEXP_REPLACE默认区分大小写,但空白符无大小写问题,无需额外参数
WHERE条件里用REPLACE会导致索引失效吗?
会。只要字段被函数包裹,如 WHERE REPLACE(phone, '-', '') = '13812345678',MySQL/PostgreSQL/SQL Server 都无法使用 phone 上的普通B-tree索引。
典型场景:清洗后匹配手机号、身份证号,但原始字段含分隔符('138-1234-5678')。
- 临时方案:加函数索引,如 MySQL 8.0+ 的
CREATE INDEX idx_phone_clean ON t ((REPLACE(phone, '-', ''))) - 长期方案:新增一个
phone_clean字段,用触发器或应用层保证同步更新,并在该字段建索引 - 别用
LIKE '%138%'替代——它更慢,且无法精准匹配
PostgreSQL中TRIM和REPLACE哪个更适合去空格?
TRIM只去首尾空白,REPLACE可去中间,二者用途完全不同。误用 TRIM 是常见坑点。
例如字段值为 ' 张 三 '(首尾+中间都有空格),TRIM(col) 返回 '张 三',中间空格仍在;而 REPLACE(col, ' ', '') 才得 '张三'。
- 只清理首尾:用
TRIM(BOTH FROM col)或简写TRIM(col),支持指定字符,如TRIM('x' FROM col) - 清理全部(含中间):必须用
REPLACE或正则REGEXP_REPLACE(col, 's+', '') - 注意:PostgreSQL 的
TRIM默认也只处理 ASCII 空格,不处理等,需配合TRANSLATE或正则
REPLACE(col, ' ', ''),等于在盲打。











