mysql_num_fields与mysql_field_count的区别
2010-12-16 15:09
531 查看
mysql_num_fields和mysql_field_count都是获取结果中列的个数,但是这两个函数在使用的时候是存在区别的。
先看一段代码(上篇文章提供的数据库):
执行结果是:
--insert------------------------
insert----count_fields is 0
insert---store return null
---select-----------
select---count_fields is 2
select---num_fields is 2
select---num_rows is 7
---select 0------
select 0---count_fields is 2
select 0---num_fields is 2
select 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
先看一段代码(上篇文章提供的数据库):
#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,"insert----count_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); }
执行结果是:
--insert------------------------
insert----count_fields is 0
insert---store return null
---select-----------
select---count_fields is 2
select---num_fields is 2
select---num_rows is 7
---select 0------
select 0---count_fields is 2
select 0---num_fields is 2
select 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
相关文章推荐
- mysql_num_fields与mysql_field_count的区别
- MySQL查询count(*)、count(1)、count(field)的区别收集
- mysql_num_rows($result)和select count()的区别
- 图解mysql_fetch_array 中 mysql_assoc 与 mysql_num 的区别
- Mysql中的count() 与sum()区别
- php 对比count(*), mysql_num_rows
- elasticsearch best_fields most_fields cross_fields从内在实现看区别——本质就是前两者是以field为中心,后者是词条为中心
- Mysql中的count()与sum()区别详细介绍
- php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
- php中mysql_num_rows与count(*)的效率对
- 【mysql】count(*),count(1)与count(column)区别
- mysql count(*)与count(1)的区别
- 数据库(oracle、mysql)中的count(*)和count(列名)的区别
- mysql count(*),count(1),count(字段)的区别
- mysql_num_rows(),mysql_fetch_row(),mysql_affected_rows的区别
- mysql技巧之select count的区别分析
- mysql_num_rows VS COUNT 效率问题分析
- mysql下count(*),count(1)与count(column)区别
- MYSQL Count(*)和Count(1)区别
- PHP中mysql_affected_rows()和mysql_num_rows()区别