2017-09-07 78 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