PrepareStatement vs "?"

    VS   

在寫程式一樣的時候,prepare statement是我們不可或缺的一向工具
透過?來動態置入查詢參數,讓SQL語句可以發揮得更淋漓盡致...

問題是....如果有不需要置換的?怎麼辦...
下面是個例子:

select concat('http://www.google.com/search?q=', param0, '&aq=f') as q,
  param1, param2 ... from some_table;

這邊希望?是sql產出值的一部分,然後透過SQL直接組織產出成為一個url string,當然,string中包含有?是url終場見到的...,此時,單純的query不會有問題,但是若在此時加上where子句,並且改寫成prepare statement格式...

select concat('http://www.google.com/search?q=', param0, '&aq=f') as q,
  param1, param2 ... from some_table where condition1 = ? and condition2 = ?;

如果上述SQL以及對應的條件送進prepare statement查詢的話,系統會很明確的告訴你...EXCEPTION!
嘗試了一下,總覺得可以透過某些方式讓SQL變成合理...

最後腦筋動到MySQL的ASCSII上面...透過MySQL的官方文件說明,可以透過CHAR這個Function來置換ASCSII的字元,而要知道字元的ASCSII碼,則可以透過ASCII Function來查詢...做了一個簡單的測試:

select ASCII('?'), CHAR(63)


執行結果如所預期... :D,修改上面的Prepare Statement後:

select concat('http://www.google.com/search',CHAR(63),'q=', param0, '&aq=f') as q,
  param1, param2 ... from some_table where condition1 = ? and condition2 = ?;

直接把?給藏起來,也就避免了程式會誤判的問題了∼YA!