日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL笔记13:查询结果集

發布時間:2025/6/15 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL笔记13:查询结果集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

操作mysql - 查詢結果集

1.用mysql進行數據查詢的時候,mysql會返回一個結果集給我們,接著我們需要調用mysql的API,從這個結果集中取得我們要的數據。取完數據之后,需要釋放這個結果集。

2.mysql的結果集其實就是一個MYSQL_RES結構,其定義如下:

typedef struct st_mysql_res { my_ulonglong row_count; // 結果集的行數 unsigned int field_count, current_field; // 結果集的列數,當前列 MYSQL_FIELD *fields; // 結果集的列信息 MYSQL_DATA *data; // 結果集的數據 MYSQL_ROWS *data_cursor; // 結果集的光標 MEM_ROOT field_alloc; // 內存結構 MYSQL_ROW row; // 非緩沖的時候用到 MYSQL_ROW current_row; //mysql_store_result時會用到。當前行 unsigned long *lengths; //每列的長度 MYSQL *handle; // mysql_use_result會用。 my_bool eof; //是否為行尾 } MYSQL_RES;typedef char **MYSQL_ROW; /* 返回的每一行的值,全部用字符串來表示*/ typedef struct st_mysql_rows { struct st_mysql_rows *next; /* list of rows */MYSQL_ROW data; } MYSQL_ROWS; //mysql的數據的鏈表節點。可見mysql的結果集是鏈表結構typedef struct st_mysql_data {my_ulonglong rows;unsigned int fields;MYSQL_ROWS *data;MEM_ROOT alloc; } MYSQL_DATA; // 數據集的結構typedef struct st_mysql_field {char *name; /* Name of column */char *table; /* Table of column if column was a field */char *def; /* Default value (set by mysql_list_fields) */enum enum_field_types type; /* Type of field. Se mysql_com.h for types */unsigned int length; /* Width of column */unsigned int max_length; /* Max width of selected set */unsigned int flags; /* Div flags */unsigned int decimals; /* Number of decimals in field */ } MYSQL_FIELD; //列信息的結構typedef struct st_used_mem { /* struct for once_alloc */ struct st_used_mem *next; /* Next block in use */unsigned int left; /* memory left in block */unsigned int size; /* Size of block */ } USED_MEM; //內存結構typedef struct st_mem_root {USED_MEM *free;USED_MEM *used;USED_MEM *pre_alloc;unsigned int min_malloc;unsigned int block_size;void (*error_handler)(void); } MEM_ROOT; //內存結構

之所以列出這些結構,是想讓大家對mysql的結果集有更清晰的認識。

3.以下是取得數據的相關API:

(1)mysql_store_result()?//將結果集實際讀取到客戶端

MYSQL_RES *mysql_store_result(MYSQL *mysql)

對于成功檢索了數據的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必須調用mysql_store_result()或mysql_use_result() 。

對于其他查詢,不需要調用mysql_store_result()或mysql_use_result(),但是如果在任何情況下均調用了mysql_store_result(),它也不會導致任何傷害或性能降低。通過檢查mysql_store_result()是否返回0,可檢測查詢是否沒有結果集(以后會更多)。

如果希望了解查詢是否應返回結果集,可使用mysql_field_count()進行檢查。

mysql_store_result()將查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,并將結果置于該結構中。如果查詢未返回結果集,mysql_store_result()將返回Null指針。

如果讀取結果集失敗,mysql_store_result()還會返回Null指針。通過檢查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以檢查是否出現了錯誤。

如果未返回行,將返回空的結果集。(空結果集設置不同于作為返回值的空指針)。

一旦調用了mysql_store_result()并獲得了不是Null指針的結果,可調用mysql_num_rows()來找出結果集中的行數。

可以調用mysql_fetch_row()來獲取結果集中的行,或調用mysql_row_seek()和mysql_row_tell()來獲取或設置結果集中的當前行位置。

一旦完成了對結果集的操作,必須調用mysql_free_result()。

(2)?mysql_use_result()//初始化結果集檢索

MYSQL_RES *mysql_use_result(MYSQL *mysql)

對于成功檢索數據的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN),必須用mysql_store_result()或mysql_use_result()。

mysql_use_result()將初始化結果集檢索,但并不像mysql_store_result()那樣將結果集實際讀取到客戶端。它必須通過對mysql_fetch_row()的調用,對每一行分別進行檢索。這將直接從服務器讀取結果,而不會將其保存在臨時表或本地緩沖區內,與mysql_store_result()相比,速度更快而且使用的內存也更少。客戶端僅為當前行和通信緩沖區分配內存,分配的內存可增加到max_allowed_packet字節。

另一方面,如果你正在客戶端一側為各行進行大量的處理操作,或者將輸出發送到了用戶可能會鍵入“^S”(停止滾動)的屏幕,就不應使用mysql_use_result()。這會綁定服務器,并阻止其他線程更新任何表(數據從這類表獲得)。

使用mysql_use_result()時,必須執行mysql_fetch_row(),直至返回NULL值,否則,未獲取的行將作為下一個檢索的一部分返回。C API給出命令不同步錯誤,如果忘記了執行該操作,將不能運行該命令。

不能對結果集用mysql_data_seek()、mysql_row_seek()、mysql_row_tell()、mysql_num_rows()或mysql_affected_rows(),也不應發出其他查詢,直至mysql_use_result()完成為止。(但是,提取了所有行后,mysql_num_rows()將準確返回提取的行數)。

一旦完成了對結果集的操作,必須調用mysql_free_result()。

返回值:MYSQL_RES結果結構。如果出現錯誤,返回NULL。

(3)mysql_fetch_row()??//取得一行的數據:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

檢索結果集的下一行。在mysql_store_result()之后使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用時,如果沒有要檢索的行或出現了錯誤,mysql_fetch_row()返回NULL。

結果集的列數目由mysql_num_fields(result)給出。如果行中保存了調用mysql_fetch_row()返回的值,將按照row[0]到row[mysql_num_fields(result)-1],訪問這些值的指針。行中的NULL值由NULL指針指明。

可以通過調用mysql_fetch_lengths()來獲得行中字段值的長度。對于空字段以及包含NULL的字段,長度為0。通過檢查字段值的指針,能夠區分它們。如果指針為NULL,字段為NULL,否則字段為空。

返回值:下一行的MYSQL_ROW結構。如果沒有更多要檢索的行或出現了錯誤,返回NULL。

示例代碼:

//假設mysql已經連接好MYSQL_RES* result = mysql_store_result(mysql); if (result == NULL)return;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"); }

(4)mysql_fetch_field()??//取得列的信息

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

返回采用MYSQL_FIELD結構的結果集的列。重復調用該函數,以檢索關于結果集中所有列的信息。未剩余字段時,mysql_fetch_field()返回NULL。

每次執行新的SELECT查詢時,將復位mysql_fetch_field(),以返回關于第1個字段的信息。調用mysql_field_seek()也會影響mysql_fetch_field()返回的字段。

如果調用了mysql_query()以在表上執行SELECT,但未調用mysql_store_result(),如果調用了mysql_fetch_field()以請求BLOB字段的長度,MySQL將返回默認的Blob長度(8KB)。之所以選擇8KB是因為MySQL不知道BLOB的最大長度。應在日后使其成為可配置的。一旦檢索了結果集,field->max_length將包含特定查詢中該列的最大值的長度。

返回值:當前列的MYSQL_FIELD結構。如果未剩余任何列,返回NULL,錯誤

示例:

MYSQL_FIELD *field;

while((field = mysql_fetch_field(result)))

{

????printf("field name %s/n", field->name);

}

(5)mysql_fetch_fields()//同4.

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

對于結果集,返回所有MYSQL_FIELD結構的數組。每個結構提供了結果集中1列的字段定義。

返回值:關于結果集所有列的MYSQL_FIELD結構的數組。

示例:

unsigned int num_fields;

unsigned int i;

MYSQL_FIELD *fields;

num_fields = mysql_num_fields(result);

fields = mysql_fetch_fields(result);

for(i = 0; i < num_fields; i++)

{

???printf("Field %u is %s/n", i, fields[i].name);

}

(6)?mysql_free_result()??//釋放結果集分配的內存

void mysql_free_result(MYSQL_RES *result)

釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果集分配的內存。完成對結果集的操作后,必須調用mysql_free_result()釋放結果集使用的內存。釋放完成后,不要嘗試訪問結果集。永遠記得要釋放結果集!!!

總結

以上是生活随笔為你收集整理的MySQL笔记13:查询结果集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女扒开下面让男人捅 | 欧美乱轮视频 | 亚洲色图综合 | 午夜精品福利视频 | 欧美成人黄色小说 | 4438x全国最大成人 | 美女扒开粉嫩的尿囗给男生桶 | 亚洲欧洲精品一区二区三区 | 国产美女激情 | 久久电影一区 | 艳妇臀荡乳欲伦交换在线播放 | 免费午夜视频在线观看 | 黄色一级大片在线免费看国产一 | 亚洲欧美日本另类 | 中文字幕人妻一区二区 | 天堂在线视频免费观看 | 中国黄色免费网站 | 久草老司机 | 玩日本老头很兴奋xxxx | 亚洲国产视频一区二区 | 自拍偷拍色 | 国产在线一区二区视频 | 人人澡人人澡人人 | 在线国产一区二区 | 91视频入口 | 少妇看片| 国产3级| 新天堂在线 | 91亚洲国产成人久久精品网站 | 久久性感视频 | 男人吃奶视频 | 国内自拍99 | 国产一区二区三区黄片 | 国内自拍偷拍视频 | 五月婷婷激情五月 | 亚洲aⅴ | 麻豆传媒在线观看视频 | 欧美一区二区三区久久综合 | 成年人小视频 | 欧美一区二区三区精品 | 国产男女裸体做爰爽爽 | 蜜桃网av| 在线免费观看国产 | 精品美女| 精品一区二区免费 | 免费观看国产精品 | 两女双腿交缠激烈磨豆腐 | 9.1成人看片免费版 日韩经典在线 | 亚洲视频在线观看网站 | 国产人妻大战黑人20p | 性涩av | 久操网站| 亚欧洲精品视频在线观看 | 激情图片网站 | 久久久精品视频网站 | 久久电影一区 | 欧美三级黄 | 国产精品自拍在线观看 | 欧美在线一 | 一级激情视频 | 中文在线日韩 | 偷拍一区二区三区 | 美女十八毛片 | 韩国无码一区二区三区精品 | 国产精品69毛片高清亚洲 | 人人爽人人香蕉 | 成人片黄网站色大片免费毛片 | 久久久国产精品黄毛片 | 久久久久18 | 精品无码一级毛片免费 | 日韩h在线观看 | 亚洲视频你懂的 | 久久久久国产精品午夜一区 | 欧美一区视频在线 | 日韩a∨| 九九热在线精品视频 | 天天操夜夜夜 | 免费人成 | 色婷婷基地 | 色天堂在线视频 | 黄色a站 | 91成人午夜 | 日本高清免费视频 | 日韩极品一区 | jizz日本在线播放 | 娇小tube性极品娇小 | 高潮无码精品色欲av午夜福利 | 久久91视频 | 成人免费看片&#39; | 毛片入口 | 久久亚洲一区二区三区四区 | 成 人 免费 黄 色 | 我爱avav色aⅴ爱avav | 日韩欧美视频二区 | 老司机免费精品视频 | 精品日本一区二区 | 国产精品久久久久毛片 | 国产伦精品一区二区三区免费迷 | 国产高清视频在线免费观看 |