2017-09-07 40 views
0

在MySQL字段 'Fparam_list' 是:为什么反斜杠后逃跑执行MySQL命令

{"fsql":"select distinct(Fuid) from dp_snap.rc_order_db_t_rc_order where Frc_order_state=20 and Fbu_type = 40 and Fapproval_code like \"%D%\" and Fapproval_code <> \"[\\\"D98\\\"]\" and SUBSTR(Fmodify_time,1,10) >= date_add(now(),-7) and SUBSTR(Fmodify_time,1,10) <= date_add(now(),-0)"} 

然后我想通过MySQL命令得到这个领域,我的shell脚本:

#!/bin/bash 

sql_str="select Fparam_list from data_platform_db.t_extraction_task_info t where Ftask_id = '64842'" 
param_list=$(/usr/bin/mysql -h127.0.0.1 -P10000 -uroot -p1234 --default-character-set=utf8 -N -e "$sql_str") 
echo $param_list 

后我执行这个shell脚本,结果是:

~/tmp/yw_home/lab$ sh test_mysql.sh 
{"fsql":"select distinct(Fuid) from dp_snap.rc_order_db_t_rc_order where Frc_order_state=20 and Fbu_type = 40 and Fapproval_code like \\"%D%\\" and Fapproval_code <> \\"[\\\\\\"D98\\\\\\"]\\" and SUBSTR(Fmodify_time,1,10) >= date_add(now(),-7) and SUBSTR(Fmodify_time,1,10) <= date_add(now(),-0)"} 

这让我感到困惑,为什么在执行后反斜杠会被转义MySQL命令?

+0

临时解决方案,使用sed的\\\\\ \\\/g'将一个反斜杠替换为两个反斜杠,但似乎不是一个好的解决方案... – ouyangyewei

+0

将数据管道化或使用临时文件可能比'-e'方法更麻烦,你必须双重转义。 – tadman

回答

1

mysql客户端会转义特殊字符,以便轻松识别它们。使用--raw选项可禁用此行为。

+0

它的工作原理,非常感谢! – ouyangyewei