MySQL 5.7 中需用 HEX() 查看字段十六进制编码确认隐藏换行符:0D 为 CHAR(13)( ),0A 为 CHAR(10)( ),0D0A 为 ;清除必须嵌套 REPLACE,顺序为先 、再 、最后 ,否则残留 。

MySQL 5.7 不支持 REGEXP_REPLACE(),清除隐藏换行符只能靠多层嵌套 REPLACE(),且必须覆盖 CHAR(13)(回车)、CHAR(10)(换行)和 '
' 组合 —— 漏掉任意一个,前端或导出时仍会换行。
怎么确认字段里到底有哪些隐藏换行符?
别猜,直接查十六进制编码。MySQL 5.7 中 HEX() 是最可靠的“透视镜”:
SELECT id, content, HEX(content) FROM your_table WHERE id = 123;- 看输出的十六进制串:出现
0D表示有CHAR(13)(),0A表示CHAR(10)(),0D0A就是 Windows 风格的 - 如果字段是从 Windows 系统导入、富文本编辑器粘贴、或 Excel 导出再导入的,大概率同时含
0D和0A
为什么不能只写一次 REPLACE(content, ' ', '')?
因为 '
' 在 MySQL 字符串字面量中只匹配单个 CHAR(10),对 CHAR(13) 或 '
' 字符串完全无效:
- 执行
UPDATE t SET c = REPLACE(c, ' ', '')后,HEX(c)仍显示0D→ 回车符还在 - 若原始数据存的是字面量
' '(两个字符:反斜杠 + r + 反斜杠 + n),那得用REPLACE(c, '\r\n', ''),不是' ' - 更隐蔽的是:有些客户端(如 DBeaver)默认不渲染
,但 JDBC 驱动会原样传给应用,导致 JSON 解析失败
5.7 安全清除的嵌套写法(顺序和层级不能错)
必须按「先组合、后单字符」顺序嵌套,否则
被拆开处理会残留孤立
:
- 清除 Windows 换行 + Unix 换行 + 单独回车:
REPLACE(REPLACE(REPLACE(col, ' ', ''), ' ', ''), ' ', '') - 清除所有常见空白符(空格、tab、换行、回车):
REPLACE(REPLACE(REPLACE(REPLACE(col, ' ', ''), ' ', ''), ' ', ''), ' ', '') - 实际更新语句示例:
UPDATE users SET bio = REPLACE(REPLACE(REPLACE(bio, ' ', ''), ' ', ''), ' ', '') WHERE bio LIKE '% %' OR bio LIKE '% %'; - 大表慎用:每层
REPLACE()都触发全字段扫描,建议加WHERE条件限制范围,或先在小数据集上测试性能
最容易被忽略的是:你看到的“没换行”,可能只是客户端不渲染
;真正影响系统交互(比如 API 返回 JSON、CSV 导出分单元格)的,往往是那个孤零零的 CHAR(13) —— 它不会出现在 LIKE '%
%' 里,但 HEX() 一眼就暴露。


















