事情由一次sql插入語句開始,我寫了一個函數getsqlcmd(),這個函數的作用是將要插入數據庫的各個字段以參數的形式傳遞進來進行字符串拼接,然後返回一個完整可用的sql語句,這個函數在我的電腦上是完全可用的,但是之前有一次我把它scp到師兄的虛擬機上,然後進行測試的時候發現插入的語句會被數據庫拒絕,報出‘違反字段非空約束’,拼接的代碼段大致如下:
string getsqlcmd(const char ** paras){
string cmd;
int sometings_id=atoi(paras[1]);
cmd=”insert into PACKEGE values(NULL,0,”;
cmd+=paras[0]+”,\’”;
cmd+=sometings_id+”\’);”
return cmd;
}
在我的筆記本上運行時,paras[1]傳入0,則拼接出來的字符串是這樣的:insert into package values(NULL,0,0,’0’);
而師兄的虛擬機中的輸出結果卻是這樣的:insert into package values(NULL,0,0,’’);
可見完全一樣的代碼在兩種環境下結果卻不一樣,應該是師兄的虛擬機中編譯器是在string+int時將這個int作爲asc碼的char類型進行處理的。