編碼的世界 / 優質文選 / 歷史

mysql_num_fields與mysql_field_count的區別


2021年11月03日
-   

mysql_num_fields和mysql_field_count都是獲取結果中列的個數,但是這兩個函數在使用的時候是存在區別的。
 
先看一段代碼(上篇文章提供的數據庫):
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char out[100];
MYSQL mysql;
MYSQL_RES* res;
int num_fields;
int count_fields;
int num_rows;
mysql_init(&mysql);
mysql_real_connect(&mysql,NULL,"root","123","ta",0,NULL,0);
fprintf(stdout,"insert/n");
mysql_real_query(&mysql,"INSERT INTO t1 VALUES(6,'n6')",29);
count_fields = mysql_field_count(&mysql);
sprintf(out,"insertcount_fields is %d/n",count_fields);
fprintf(stdout,out);
res = mysql_store_result(&mysql);
if(res == NULL)
{
fprintf(stdout,"insert-store return null/n");
}
else
{
num_fields = mysql_num_fields(res);
sprintf(out,"insert-num_fields is %d/n",num_fields);
fprintf(stdout,out);
}
fprintf(stdout,"-select-/n");
mysql_real_query(&mysql,"SELECT * FROM t1",16);
count_fields = mysql_field_count(&mysql);
sprintf(out,"select-count_fields is %d/n",count_fields);
fprintf(stdout,out);
res = mysql_store_result(&mysql);
if(res == NULL)
{
fprintf(stdout,"select-store return null/n");
}
else
{
num_fields = mysql_num_fields(res);
sprintf(out,"select-num_fields is %d/n",num_fields);
fprintf(stdout,out);
num_rows = mysql_num_rows(res);
sprintf(out,"select-num_rows is %d/n",num_rows);
fprintf(stdout,out);
}
fprintf(stdout,"-select 0/n");
mysql_real_query(&mysql,"SELECT * FROM t1 where id = 10",30);
count_fields = mysql_field_count(&mysql);
sprintf(out,"select 0-count_fields is %d/n",count_fields);
fprintf(stdout,out);
res = mysql_store_result(&mysql);
if(res == NULL)
{
fprintf(stdout,"select 0-store return null/n");
}
else
{
num_fields = mysql_num_fields(res);
sprintf(out,"select 0-num_fields is %d/n",num_fields);
fprintf(stdout,out);
num_rows = mysql_num_rows(res);
sprintf(out,"select 0-num_rows is %d/n",num_rows);
fprintf(stdout,out);
}
mysql_free_result(res);
mysql_close(&mysql);
exit(0);
}
 
執行結果是:insertinsertcount_fields is 0insert-store return null-select-select-count_fields is 2select-num_fields is 2select-num_rows is 7-select 0select 0-count_fields is 2select 0-num_fields is 2select 0-num_rows is 0
 
顯然,當執行insert語句的時候,是沒有結果返回的,因此列的個數為0,且mysql_store_result返回NULL。因此可以通過mysql_field_count()是否返回0來判斷是否有結果返回,而不需要執行mysql_store_result來判斷是否返回了NULL。我想,mysql_field_count()的效率肯定要比mysql_store_result()高。
在這種情況下,由於沒有返回結果,因此mysql_store_result()返回NULL,也就是得不到res指針,於是mysql_num_fields()函數就無法執行,缺少必要的參數。
 
當執行第一條select語句的時候,返回了結果,因此mysql_field_count()和mysql_num_fields()都返回了正確的列的個數2,mysql_num_rows()返回了記錄的條數7.
 
當執行第二條select語句,由於表中沒有 id = 0 的記錄,因此mysql_num_rows返回了0表示記錄數為0,但是,我們發現mysql_store_result()並沒有返回NULL,mysql_num_fields()和mysql_field_count()還是返回了2.
 
因此我們可以得出這樣的結論:
執行結果有三種情況,第一是執行insert、update和delete這樣的語句的時候,是不會有任何內容返回,因此mysql_store_result()會返回一個NULL。第二,執行select或show這樣的語句時,一定會有內容返回,可以取得列信息,但是記錄可以為0,也可以不為0。這就像一個表,表頭一定存在,但是表中可以沒有數據。
 
另外:
mysql_affected_rows()函數的作用是,當執行update  insert  delete 時,返回影響的行數。
 
mysql中文文檔:
http://dev.mysql.com/doc/refman/5.1/zh/apis.html

熱門文章