MySQL C API с использованием результатов

Я использую MySQL C API для запроса базы данных, и у меня есть результаты, хранящиеся в типах MYSQL_ROW. Я могу распечатать результаты на консоли с помощью

printf("%s", row[0]);

однако, согласно документации MySQL C API, я не могу использовать их как строки с завершающим нулем.

Внизу обзор функций говорится, что я могу «извлечь» информацию с помощью mysql_store_result() или mysql_use_result(). Однако я все еще не понимаю, как это делается.

В идеале я хочу использовать результаты в виде строки, чтобы я мог делать такие вещи, как strcmp, но в противном случае мне определенно нужно как-то использовать информацию с этими двумя функциями.

Может кто-нибудь показать мне пример, как это сделать?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
3 737
1

Ответы 1

По сути, вы вызываете mysql_store_result () или mysql_use_result () для доступа к набору результатов, первый загружает все строки в память на стороне клиента, последний обращается к строкам по одной с сервера. Если вы используете mysql_use_result (), вам нужно вызвать mysql_fetch_row () для доступа к каждой строке, пока функция не вернет NULL. Каждый успешный вызов mysql_fetch_row () вернет MYSQL_ROW, который вы можете использовать для доступа к отдельным значениям полей.

Поскольку поля не завершаются нулем, вам нужно использовать mysql_fetch_lengths (), чтобы получить длину каждого из полей, чтобы вы могли скопировать их в другое место с помощью memcpy и т. д.

Поскольку значения полей не оканчиваются нулем, вам нужно будет добавить свой собственный символ NUL при создании копии, если вы хотите использовать его как строку. Имейте в виду, что значения полей могут содержать двоичные данные, поэтому, если вы обрабатываете их как строку, функции, ожидающие строку C, прекратят обработку данных, если они встретят в данных нулевой символ.

Вот пример из документации, который должен помочь вам собрать все это воедино:

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i], 
              row[i] ? row[i] : "NULL");
   }
   printf("\n");
}

Спасибо, поэтому я могу получить длину, но что, если мне нужно получить что-то, что хранится как varchar в базе данных? Означает ли это, что я не могу использовать strcmp с результатами?

Steve 07.11.2008 04:24

mysql_fetch_lengths () возвращает размер каждого поля в определенной строке, он может быть разным для одного и того же столбца каждой строки.

Robert Gamble 07.11.2008 04:31

Нет, вы не можете использовать strcmp (), потому что значение поля не будет завершаться нулем, вместо этого используется memcpy () или strncmp ().

Robert Gamble 07.11.2008 04:33

Другие вопросы по теме