[問題] 字串過長導致mysql query語句失敗

作者: leepair (leepair)   2014-12-09 12:29:11
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) linux
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no
問題(Question):
各位版大午安,C新手遇到query語句內容過長被切斷導致失敗,請問
Char* str = mallco(max)會有最大長度限制嗎?因為宣告的matchList超過一定長度
後會變"...", 如下:
"8731566,3936716,8130337,3354438,2053144,2851501,6844897,5783871,
5955828,7111137,4619358,5153177,8982397,5722294,9477904,9621609,5946231,
3959745,5844175,1853635,9266298,2098142,7880399,5827968,2090412,7400260,
5673557,7441594,8688008,4716395,4325968,8119113,3204530,2471006,7910962,..."
query的語句的最後也變成"...", 被切掉變成不完整的語句,如下:
"INSERT INTO userTable (`userNo`, `matchList`, `matchCount`) values(
'1016807', '3650073,4943658,2108930,3211272,3027544,9850878,1777923,1237709,
5564440,9438165,3484492,3243042,7807987,4522503,2282327,8531729,5378840,
9542612,6544303,8833169,5817709,1097157,9129560,7570933,9493099,1280278,
3351816..."
請問是我的char*宣告的不夠長嗎? 還是超過了限制? 請大大們指導一下,感恩。
程式碼:
for (int i = 0; i < UserAmount; i++) {
int userNo = get_random_number(1000000, 9999999);
char userNoStr[128];
snprintf(userNoStr, 128, "%d", userNo);
printf("user no: %s\n", userNoStr);
int matchCount = get_random_number(10, 1000);
int matchlength = matchCount * (int)(strlen(userNoStr) + 1) * sizeof(char);
char* matchList = malloc(matchCharLength);
for (int j = 0; j < matchCount; j++) {
char matchUserNo[256];
if (strlen(matchList) == 0) {
snprintf(matchUserNo, 256, "%d", get_random_number(1000000, 9999999));
}
else{
snprintf(matchUserNo, 256, ",%d", get_random_number(1000000, 9999999));
}
strcat(matchList, matchUserNo);
}
int queryCharLength = (int)strlen(matchList) + 128;
char* sqlInsertUserNo = malloc(queryCharLength);
snprintf(sqlInsertUserNo, queryCharLength, "INSERT INTO userTable (`userNo
`, `matchList`, `matchCount`) values('%d', '%s', '%d') ON DUPLICATE KEY
UPDATE `userNo` = '%d'", userNo, matchList, matchCount, userNo);
int queryFail = mysql_query(mysqlConnection, sqlInsertUserNo);
if (queryFail) {
printf("Error query: %s\n", sqlInsertUserNo);
printf("Error %s\n", mysql_error(mysqlConnection));
mysql_close(mysqlConnection);
exit(0);
}
}
作者: q82419 (q82419)   2014-12-09 15:44:00
malloc出來記得要先memset你的malloc吃的應該是matchlength吧?malloc吃的是size_t 出來的東西要轉char*不然會有warning看起來很像是C字串結尾沒有補'\0'的關係
作者: MOONRAKER (㊣牛鶴鰻毛人)   2014-12-09 18:34:00
好偉大的資料庫欄位。 :|SUPER BIG
作者: Killercat (殺人貓™)   2014-12-09 22:34:00
這個問題不在你 在資料庫的設計人 去把他抓出來打屁屁

Links booklink

Contact Us: admin [ a t ] ucptt.com