将rsync输出写入MySQL数据库时丢失格式问题求助
解决rsync日志插入MySQL丢失格式的问题
嘿,我来帮你搞定这个头疼的小问题!你遇到的情况其实很常见——终端能正常显示换行、空格和制表符,但插入MySQL后这些格式就消失了,核心原因是特殊字符没有被正确转义,MySQL把它们当成了SQL语句的空白分隔符,而不是字符串的一部分。
下面给你两种靠谱的解决方案,你可以根据自己的脚本情况选择:
方案一:转义rsync输出中的特殊字符
在把rsync输出插入数据库前,先对换行符(\n)、制表符(\t)和单引号(')做转义处理,确保MySQL能识别它们是字符串的一部分。
修改你的脚本步骤:
- 先捕获rsync的输出,然后用
sed完成转义:
# 捕获rsync的标准输出和错误输出 RSYNC_OUTPUT=$(rsync -av /你的源路径/ /你的目标路径/ 2>&1) # 转义特殊字符:替换单引号为\',换行为\n,制表符为\t ESCAPED_OUTPUT=$(echo "$RSYNC_OUTPUT" | sed -e "s/'/\\'/g" -e 's/\n/\\n/g' -e 's/\t/\\t/g')
- 插入数据库时使用转义后的变量:
# 假设你的表结构包含log_date, log_time, content三个字段 mysql -u 你的用户名 -p'你的密码' -D 你的数据库名 <<EOF INSERT INTO 你的表名 (log_date, log_time, content) VALUES ('$DATUM', '$IDO', '$ESCAPED_OUTPUT'); EOF
方案二:直接用日志文件导入数据库(更高效)
你本来就把rsync输出写到了日志文件里,不如直接用MySQL的LOAD DATA INFILE命令导入,这样既保留格式,又避免了转义的麻烦:
- 确保rsync日志已经正确写入文件(你脚本里的
LOG_FAJL部分):
rsync -av /你的源路径/ /你的目标路径/ 2>&1 > "$LOG_FAJL"
- 用LOAD DATA命令导入文件到数据库:
mysql -u 你的用户名 -p'你的密码' -D 你的数据库名 -e " LOAD DATA LOCAL INFILE '$LOG_FAJL' INTO TABLE 你的表名 FIELDS TERMINATED BY '' # 因为日志是纯文本,没有字段分隔符 LINES TERMINATED BY '\n' (content) # 指定导入到content字段 SET log_date='$DATUM', log_time='$IDO'; # 手动设置日期和时间字段 "
注意:如果你的MySQL禁用了LOCAL INFILE,需要先在配置里开启,或者连接时加上--local-infile参数。
为什么终端显示正常?
终端会自动解析原始的换行符、制表符,把它们转换成视觉上的换行和缩进;但MySQL在处理未转义的字符串时,会把这些字符当成SQL语句的空白,直接忽略掉,所以数据库里就变成了一行。
内容的提问来源于stack exchange,提问作者Thomas




