将數據從一張表遷移到另外一張表的過程中,通過mysql的concat方法批量生成sql時遇到了一個問題,即進行UPDATE更新操作時如果原表中的字段中包含單引号'或者雙引号",那麼就會生成不正确的update語句。
原因當然很簡單因為update table set xxx = 'content'時content一般由英文單引号'或者雙引号"包裹起來,使用單引号較多。
如果content中包含單引号'時我們需要對單引号'進行轉義或者将content用雙引号括起來,這樣雙引号"裡面的單引号'就會被視為普通的字符,同理如果content中包含雙引号"那麼我們就可以換成單引号括起來content,這樣雙引号"就會被視為普通字符。但是如果content中既包含單引号'又包含雙引号",這時我們就不得不對content中的内容進行轉義了。
實踐學生表student中有以下四條數據,現在要把student表中的四條數據按照id更新到用戶表user當中,user表的結構同student一樣。
1、内容中含有單引号有單引号的可以用雙引号括起來
select concat("update user set name = '",name,"' where id = ",id,";") from student where id = 1;
有雙引号的可以用單引号括起來
select concat("update user set name = \"",name,"\" where id = ",id,";") from student where id = 3;
需使用replace函數将content中的單引号和雙引号替換為轉義的形式。
函數介紹:replace(object,search,replace),把object對象中出現的的search全部替換成replace。
select concat("update user set name = '",replace(replace(name,"'","\\\'"),"\"","\\\""),"' where id = ",id,";") from student where id = 2;
對student整表應用以下sql
select concat("update user set name = '",replace(replace(name,"'","\\\'"),"\"","\\\""),"' where id = ",id,";") from student;
得到的結果是:
update user set name = '小明\"' where id = 1;
update user set name = '\'翎\"野' where id = 2;
update user set name = '\'小王' where id = 3;
update user set name = '小李' where id = 4;
我是「翎野君」,感謝各位朋友的:點贊、收藏和評論,我們下期見。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!