Это просто удача, если помещение поля из MYSQL_ROW в массив символов с помощью sprintf не приводит к сбою?

#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 — согласно этой документации, совершенно нормально обрабатывать каждое поле как текстовые данные. Кажется, противоречит документации, на которую я указал (теперь моя ссылка работает). Я предполагаю, что они используют длины полей, чтобы гарантировать, что они не выводят мусор.