MySQL中换行符的实际存储是
,对应ASCII码10,无论客户端如何输入,数据库统一存储为
。显示时,根据客户端设置或编程语言处理,可能显示异常。要避免错乱,使用REPLACE函数替换:UPDATE table SET content = REPLACE(REPLACE(content, '
', '
'), '
', '
'); 查询时用SELECT REPLACE(content, '
', '
') FROM table;
来源1
在MySQL数据库中,换行符统一存储为LF( ,十进制10),不管前端是Windows的CRLF( )还是Linux的LF,都会被转换为单一的LF。这是MySQL的内部机制。插入数据时,如果是 ,会被存成 。
来源2
测试发现:insert into t values('a
b'); select * from t; 实际存储是a
b,
被忽略了。解决显示异常:select replace(col, char(10), '
');
来源3
MySQL字符集utf8mb4下,换行符
存储占用1字节。避免错乱的最佳实践:统一用
存储,输出时根据前端需求替换。比如PHP中str_replace("\n", "
", $str);
来源4
问题:从Windows复制文本到MySQL,显示乱了。原因:Windows ,MySQL存 ,浏览器解析时不识别。解决方案:在INSERT前预处理:content = content.replace(/\r?\n/g, '\n');
来源5
数据库查看十六进制:select hex(content) from t; 显示0A就是 。JSON导出时 会转义成\n,没问题。但前端渲染需注意。
来源6
避免异常:建表时不设特殊,存储让MySQL管,读取时处理。Java中:string.replaceAll("\r?\n", "
");
FAQ
Q: MySQL存的换行符是什么?
A: 统一存
(LF)。
Q: Windows文本为什么乱?
A:
变
,浏览器不直接显示
。
Q: 怎么查询替换显示?
A: SELECT REPLACE(content, CHAR(10), '
') FROM table;
Q: 插入前怎么统一?
A: 用REPLACE(REPLACE(str, '\r\n', '\n'), '\r', '\n');