(七)MYSQL编程
1.数据类型:
MYSQL
這個結構表示對一個數據庫連接的句柄,它被用于幾乎所有的MySQL函數。
MYSQL_RES
這個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。從查詢返回的信息在本章下文稱為結果集合。
MYSQL_ROW
這是一個行數據的類型安全(type-safe)的表示。當前它實現為一個計數字節的字符串數組。(如果字段值可能包含二進制數據,你不能將這些視為空終止串,因為這樣的值可以在內部包含空字節) 行通過調用mysql_fetch_row()獲得。
MYSQL_FIELD
這個結構包含字段信息,例如字段名、類型和大小。其成員在下面更詳細地描述。你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。字段值不是這個結構的部分;他們被包含在一個MYSQL_ROW結構中。
MYSQL_FIELD_OFFSET
這是一個相對一個MySQL字段表的偏移量的類型安全的表示。(由mysql_field_seek()使用。) 偏移量是在一行以內的字段編號,從0開始。
my_ulonglong
該類型用于行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。這種類型提供0到1.84e19的一個範圍。在一些系統上,試圖打印類型my_ulonglong的值將不工作。為了打印出這樣的值,將它變換到unsigned long並且使用一個%lu打印格式。例如:
printf (Number of rows: %lu/n", (unsigned long) mysql_num_rows(result));
MYSQL_FIELD結構包含列在下面的成員:
char * name
字段名,是一個空結尾的字符串。
char * table
包含該字段的表的名字,如果它不是可計算的字段。對可計算的字段,table值是一個空字符串。
char * def
這字段的缺省值,是一個空結尾的字符串。只要你使用,只有你使用mysql_list_fields()才可設置它。
enum enum_field_types type
字段類型。type值可以是下列之一:
類型值 類型含義
FIELD_TYPE_TINY TINYINT字段
FIELD_TYPE_SHORT SMALLINT字段
FIELD_TYPE_LONG INTEGER字段
FIELD_TYPE_INT24 MEDIUMINT字段
FIELD_TYPE_LONGLONG BIGINT字段
FIELD_TYPE_DECIMAL DECIMAL或NUMERIC字段
FIELD_TYPE_FLOAT FLOAT字段
FIELD_TYPE_DOUBLE DOUBLE或REAL字段
FIELD_TYPE_TIMESTAMP TIMESTAMP字段
FIELD_TYPE_DATE DATE字段
FIELD_TYPE_TIME TIME字段
FIELD_TYPE_DATETIME DATETIME字段
FIELD_TYPE_YEAR YEAR字段
FIELD_TYPE_STRING 字符串(CHAR或VARCHAR)字段
FIELD_TYPE_BLOB BLOB或TEXT字段(使用max_length決定最大長度)
FIELD_TYPE_SET SET字段
FIELD_TYPE_ENUM ENUM字段
FIELD_TYPE_NULL NULL- 類型字段
FIELD_TYPE_CHAR 不推薦;使用FIELD_TYPE_TINY代替
你可以使用IS_NUM()宏來測試字段是否有一種數字類型。將type值傳給IS_NUM()並且如果字段是數字的,它將計算為TRUE:
if (IS_NUM(field->type))
printf("Field is numeric/n");
unsigned int length
字段寬度,在表定義中指定。
unsigned int max_length
對結果集合的字段的最大寬度(對實際在結果集合中的行的最長字段值的長度)。如果你使用mysql_store_result()或mysql_list_fields(),這包含字段最大長度。如果你使用mysql_use_result(),這個變量的值是零。
unsigned int flags
字段的不同位標志。flags值可以是零個或多個下列位設置:
標志值 標志含義
NOT_NULL_FLAG 字段不能是NULL
PRI_KEY_FLAG 字段是一個主鍵的一部分
UNIQUE_KEY_FLAG 字段是一個唯一鍵的一部分
MULTIPLE_KEY_FLAG 字段是一個非唯一鍵的一部分。
UNSIGNED_FLAG 字段有UNSIGNED屬性
ZEROFILL_FLAG 字段有ZEROFILL屬性
BINARY_FLAG 字段有BINARY屬性
AUTO_INCREMENT_FLAG 字段有AUTO_INCREMENT屬性
ENUM_FLAG 字段是一個ENUM(不推薦)
BLOB_FLAG 字段是一個BLOB或TEXT(不推薦)
TIMESTAMP_FLAG 字段是一個TIMESTAMP(不推薦)
BLOB_FLAG、ENUM_FLAG和TIMESTAMP_FLAG標志的使用是不推薦的,因為他們指出字段的類型而非它的類型屬性。對FIELD_TYPE_BLOB、FIELD_TYPE_ENUM或FIELD_TYPE_TIMESTAMP,最好是測試field->type。下面例子演示了一個典型的flags值用法:
if (field->flags & NOT_NULL_FLAG)
printf("Field can't be null/n");
你可以使用下列方便的宏決來確定flags值的布爾狀態:
IS_NOT_NULL(flags) 真,如果該字段被定義為NOT NULL
IS_PRI_KEY(flags) 真,如果該字段是一個主鍵
IS_BLOB(flags) 真,如果該字段是一個BLOB或TEXT(不推薦;相反測試field->type)
unsigned int decimals
對數字字段的小數位數。
2. my_ulonglong mysql_affected_rows(MYSQL *mysql) 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。
void mysql_close(MYSQL *mysql) 關閉一個服務器連接。
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd) 連接一個MySQL服務器。該函數不推薦;使用mysql_real_connect()代替。
my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db) 改變在一個打開的連接上的用戶和數據庫。
int mysql_create_db(MYSQL *mysql, const char *db) 創建一個數據庫。該函數不推薦;而使用SQL命令CREATE DATABASE。
void mysql_data_seek(MYSQL_RES *result, unsigned long long offset) 在一個查詢結果集合中搜尋一任意行。
void mysql_debug(char *debug) 用給定字符串做一個DBUG_PUSH。
int mysql_drop_db(MYSQL *mysql, const char *db) 拋棄一個數據庫。該函數不推薦;而使用SQL命令DROP DATABASE。
int mysql_dump_debug_info(MYSQL *mysql) 讓服務器將調試信息寫入日志文件。
my_bool mysql_eof(MYSQL_RES *result) 確定是否已經讀到一個結果集合的最後一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。
unsigned int mysql_errno(MYSQL *mysql) 返回最近被調用的MySQL函數的出錯編號。
char *mysql_error(MYSQL *mysql) 返回最近被調用的MySQL函數的出錯消息。
unsigned int mysql_escape_string(char *to, const char *from, unsigned int length) 用在SQL語句中的字符串的轉義特殊字符。
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) 返回下一個表字段的類型。
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 返回一個表字段的類型,給出一個字段編號。
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr) 返回一個所有字段結構的數組。
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)返回當前行中所有列的長度。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) 從結果集合中取得下一行。
unsigned int mysql_field_count(MYSQL *mysql) 把列光標放在一個指定的列上。
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset) 返回最近查詢的結果列的數量。
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)返回用于最後一個mysql_fetch_field()的字段光標的位置。
void mysql_free_result(MYSQL_RES *result) 釋放一個結果集合使用的內存。
char *mysql_get_client_info(void) 返回客戶版本信息。
char *mysql_get_host_info(MYSQL *mysql) 返回一個描述連接的字符串。
unsigned int mysql_get_proto_info(MYSQL *mysql) 返回連接使用的協議版本。
char *mysql_get_server_info(MYSQL *mysql) 返回服務器版本號。
char *mysql_info(MYSQL *mysql) 返回關于最近執行得查詢的信息。
MYSQL *mysql_init(MYSQL *mysql) 獲得或初始化一個MYSQL結構。
my_ulonglong mysql_insert_id(MYSQL *mysql)返回有前一個查詢為一個AUTO_INCREMENT列生成的ID。
int mysql_kill(MYSQL *mysql, unsigned long pid) 殺死一個給定的線程。
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) 返回匹配一個簡單的正則表達式的數據庫名。
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) 返回匹配一個簡單的正則表達式的列名。
MYSQL_RES *mysql_list_processes(MYSQL *mysql) 返回當前服務器線程的一張表。
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild) 返回匹配一個簡單的正則表達式的表名。
unsigned int mysql_num_fields(MYSQL_RES *result) 返回一個結果集合重的列的數量。
my_ulonglong mysql_num_rows(MYSQL_RES *result) 返回一個結果集合中的行的數量。
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg) 設置對mysql_connect()的連接選項。
int mysql_ping(MYSQL *mysql) 檢查對服務器的連接是否正在工作,必要時重新連接。
int mysql_query(MYSQL *mysql, const char *query)執行指定為一個空結尾的字符串的SQL查詢。
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag) 連接一個MySQL服務器。
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length) 執行指定為帶計數的字符串的SQL查詢。
int mysql_reload(MYSQL *mysql) 告訴服務器重裝授權表。
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset) 搜索在結果集合中的行,使用從mysql_row_tell()返回的值。
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result) 返回行光標位置。
int mysql_select_db(MYSQL *mysql, const char *db) 連接一個數據庫。
int mysql_shutdown(MYSQL *mysql) 關掉數據庫服務器。
char *mysql_stat(MYSQL *mysql) 返回作為字符串的服務器狀態。
MYSQL_RES *mysql_store_result(MYSQL *mysql) 檢索一個完整的結果集合給客戶。
unsigned long mysql_thread_id(MYSQL *mysql) 返回當前線程的ID。
MYSQL_RES *mysql_use_result(MYSQL *mysql) 初始化一個一行一行地結果集合的檢索