SQL Server中需嵌套REPLACE依次清除CHAR(13)、CHAR(10)、CHAR(9),顺序无关但必须全覆盖;TEXT类型须先CAST为VARCHAR(MAX);PostgreSQL可用TRANSLATE一行替换,MySQL 8.0+支持REGEXP_REPLACE。

SQL Server 中用 REPLACE 处理换行符和制表符
SQL Server 不支持正则,得靠嵌套 REPLACE 逐个干掉控制字符。常见的换行符是 CHAR(10)(LF),Windows 换行还含 CHAR(13)(CR),制表符是 CHAR(9)。直接写三层嵌套最稳妥,顺序不重要,但建议从内到外清理:
SELECT
REPLACE(
REPLACE(
REPLACE(column_name, CHAR(13), ''),
CHAR(10), ''),
CHAR(9), '') AS cleaned_text
FROM table_name;
- 必须按字段名写全,不能对整行或
*批量操作 -
CHAR(13)+CHAR(10)组合常见,但分别替换已覆盖所有情况,无需额外处理组合 - 如果字段为
TEXT类型(已弃用),需先CAST成VARCHAR(MAX),否则REPLACE报错
PostgreSQL 用 TRANSLATE 一行解决
PostgreSQL 的 TRANSLATE 函数比嵌套 REPLACE 更简洁:它把多个源字符一次性映射为空。换行符 E'\n'、回车 E'\r'、制表符 E'\t' 都能塞进去:
SELECT TRANSLATE(column_name, E'\r\n\t', '') AS cleaned_text FROM table_name;
-
E''前缀必须加,否则反斜杠不被识别为转义 - 三个字符长度必须和空字符串长度一致(即都删掉),所以第二个参数是
E'\r\n\t',第三个是'' - 若字段含 Unicode 控制符(如零宽空格
U+200B),TRANSLATE无法处理,得用REGEXP_REPLACE
MySQL 8.0+ 支持 REGEXP_REPLACE,但要注意默认模式
MySQL 8.0 起有 REGEXP_REPLACE,但默认是区分大小写的 POSIX 模式,且不自动匹配多行。要删所有空白控制符,得显式写字符类:
SELECT REGEXP_REPLACE(column_name, '[\r\n\t]', '') AS cleaned_text FROM table_name;
- 方括号内
\r\n\t是字面量,不是转义——MySQL 正则里\n就代表换行符,不用写CHAR() - 旧版 MySQL(REPLACE(REPLACE(...)) 模拟
- 如果字段含垂直制表符
CHAR(11)或换页符CHAR(12),需扩展正则为[\r\n\t\v\f]
WHERE 条件里清理后匹配容易漏掉 NULL 和空格
在 WHERE 中清理字段做模糊匹配时,光删控制符不够:原始值可能是 NULL,或只剩空格,导致 LIKE 或 = 失效:
WHERE TRIM(REPLACE(REPLACE(REPLACE(column_name, CHAR(13), ''), CHAR(10), ''), CHAR(9), '')) = 'abc'
- 一定要套
TRIM(),否则换行符替换成空字符串后,前后空格还在 -
NULL字段经REPLACE后仍是NULL,和任何值比较都为UNKNOWN,需加column_name IS NOT NULL - 索引不会生效——这类表达式无法走普通 B-tree 索引,大数据量时考虑建计算列或物化视图

















