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

看板C_and_CPP作者 (leepair)時間11年前 (2014/12/09 12:29), 編輯推噓4(403)
留言7則, 3人參與, 最新討論串1/1
開發平台(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); } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.219.220.135 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1418099355.A.DEA.html

12/09 15:44, , 1F
malloc出來記得要先memset
12/09 15:44, 1F

12/09 15:46, , 2F
你的malloc吃的應該是matchlength吧?
12/09 15:46, 2F

12/09 15:47, , 3F
malloc吃的是size_t 出來的東西要轉char*不然會有warning
12/09 15:47, 3F

12/09 15:50, , 4F
看起來很像是C字串結尾沒有補'\0'的關係
12/09 15:50, 4F

12/09 18:34, , 5F
好偉大的資料庫欄位。 :|
12/09 18:34, 5F

12/09 18:39, , 6F
SUPER BIG
12/09 18:39, 6F

12/09 22:34, , 7F
這個問題不在你 在資料庫的設計人 去把他抓出來打屁屁
12/09 22:34, 7F
文章代碼(AID): #1KXdgRtg (C_and_CPP)