#mysql #c
#mysql #c
Вопрос:
Я пишу программу (как часть более крупного приложения), которая использует MYSQL C API. Некоторый начальный код, казалось, работал нормально, но затем я сделал что-то более сложное и получил сбой при доступе к полям MYSQL_ROW.
У меня возникли проблемы с поиском подробной документации о том, что такое MYSQL_ROW; в документации MYSQL C API говорится, что это «массив подсчитанных байтовых строк», которые нельзя считать завершающимися нулем, поскольку они могут содержать двоичные данные. В нем не говорится, будут ли данные текстовыми, строка будет дополнительно завершаться нулем, и я не уверен, какие типы данных MYSQL будут возвращены как текст или двоичный (например, MEDIUMINT возвращается как текст или как 3 двоичных байта?).
Это просто удача, если приведенный ниже код не вылетает? (предположим, что dbcon является допустимым подключением к MYSQL)
char field[MAX_CHARS_I_MIGHT_STORE_IN_FIELD 1];
MYSQL_RES *resu<
MYSQL_ROW row;
mysql_query(dbcon, "SELECT * FROM table;");
result = mysql_store_result(dbcon);
row = mysql_fetch_row(result);
if(row){
sprintf(field, "%s", row[0]);
}
Комментарии:
1. В чем проблема? Происходит ли сбой кода? или нет? Какие результаты вы получаете? (чтобы ответить: «возвращается как текст или как 3 двоичных байта») В конце дня вы всегда довольны, если ваш код не вылетает…..
2. Если в базе данных нет данных, строка будет нулевой. Если вы затем вызовете row[0], произойдет сбой
3. Пожалуйста, ознакомьтесь с руководством и примерами , чтобы получить представление о том, как использовать mysql_row.
4. @Claus — точка взята, отредактирована.
5. @Solarflare — согласно этой документации, совершенно нормально обрабатывать каждое поле как текстовые данные. Кажется, противоречит документации, на которую я указал (теперь моя ссылка работает). Я предполагаю, что они используют длины полей, чтобы гарантировать, что они не выводят мусор.