MYSQL_ROW и строка [0] для типа строки? - PullRequest
2 голосов
/ 09 ноября 2008

При использовании MYSQL C API для запроса результатов. Результаты возвращаются в виде MYSQL_ROW, что в соответствии с документацией MYSQL C API, я могу легко printf("%s", row[0]). Но что, если я хочу перевести содержимое row[0] в строку или символ *?

Ответы [ 3 ]

1 голос
/ 09 ноября 2008

Формат% s должен принимать только символ *, поэтому из вашего описания похоже, что MYSQL_ROW на самом деле является символом **, и взятие строки [0] в любом случае даст символ *.

Я не понимаю, как использование sprintf () (или более безопасного, но нестандартного asprintf ()) принесет какую-то пользу, но вы можете рассмотреть это, если вам станет лучше.

0 голосов
/ 02 марта 2019

Но что, если я хочу перевести содержимое строки [0] в строку или символ *?

Используйте mysql_fetch_lengths, чтобы определить длину массива в MYSQL_ROW. Поскольку в строке 1 или более столбцов, может быть 1 или более длин.

Согласно 27.8.5 C Структуры данных API Документация:

MYSQL_ROW

Это безопасное для типов представление одной строки данных. В настоящее время реализован в виде массива подсчитанных байтовых строк. (Вы не можете лечить это строки с нулевым символом в конце, если значения полей могут содержать двоичные данные, потому что такие значения могут содержать нулевые байты внутри.) Строки полученный по телефону mysql_fetch_row().

Затем документация mysql_fetch_row приводит этот пример:

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");
}

Вот пример использования его для подсчета строк в таблице. Таблица была заполнена из нарушений FTC Do No Call .

MYSQL_RES* res = NULL;
MYSQL row;

const char SELECT_STMT[] = "SELECT COUNT(*) FROM blacklist_ftc";
if (mysql_query(mysql, SELECT_STMT) != 0)
{
    /* handle error */
    goto finish;
}

if ((res = mysql_store_result(s_mysql)) == NULL)
{
    /* handle error */
    goto finish;
}

if (mysql_num_fields(res) != 1 || mysql_num_rows(res) != 1)
{
    /* handle error */
    goto finish;
}

char buf[32];
unsigned long* length;

row = mysql_fetch_row(res);
length = mysql_fetch_lengths(res);

if (row == NULL || length == NULL)
{
    /* handle error */
    goto finish;
}

size_t size = length[0] < sizeof(buf)-1 ? length[0] : sizeof(buf)-1;
memcpy(buf, row[0], size);
buf[size] = '\0';

unsigned long count = (unsigned long)atoi(buf);

finish:

if (res)
{
    mysql_free_result(res);
    res = NULL;
}
0 голосов
/ 09 ноября 2008

Вы можете использовать sprintf () , но вам все равно нужно будет знать длину строки, содержащейся в строке [0], чтобы вы могли выделить достаточно памяти.

Предупреждение: BCS правильно указывает, что ваши данные будут усечены, если строка [0] содержит дополнительные нулевые байты. Если вы знаете, сколько данных хранится в строке [0], лучше использовать memcpy () .

...