c++使用Mysql的详解及常用操作示例
1 Mysql数据类型
MYSQL
该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。不应尝试拷贝MYSQL结构 。不保证这类拷贝结果会有用。
MYSQL_RES
typedef struct st_mysql_res {
my_ulonglong row_count;
MYSQL_FIELD * fields;
MYSQL_DATA * data;
MYSQL_ROWS * data_cursor;
unsigned long * lengths;
MYSQL * handle;
const struct st_mysql_methods * methods;
MYSQL_ROW row;
MYSQL_ROW current_row;
MEM_ROOT field_alloc;
unsigned int field_count, current_field;
my_bool eof;
my_bool unbuffered_fetch_cancelled;
void * extension;
} MYSQL_RES;
描述:该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。
MYSQL_ROW
原型:typedef char **MYSQL_ROW;
描述:一个字符串数组,所有得数据类型都被转换成字符串送到客户端。 相关API:MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
MYSQL_FIELD
typedef struct st_mysql_field {
char * name;
char * org_name;
char * table;
char * org_table;
char * db;
char * catalog;
char * def;
unsigned long length;
unsigned long max_length;
unsigned int name_length;
unsigned int org_name_length;
unsigned int table_length;
unsigned int org_table_length;
unsigned int db_length;
unsigned int catalog_length;
unsigned int def_length;
unsigned int flags;
unsigned int decimals;
unsigned int charsetnr;
enum enum_field_types type;
void * extension;
} MYSQL_FIELD;
描述:该结构包含关于字段的信息,如字段名、类型和大小。(不包含字段值, 字段值在MYSQL_ROW中) 相关API:MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result);
MYSQL_FIELD_OFFSET
原型:typedef unsigned int MYSQL_FIELD_OFFSET;
描述:这是MySQL字段列表偏移量的“类型安全”表示(由mysql_field_seek()使用)。偏移量是行内的字段编号,从0开始。 相关API:MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset);
2 字段标志
标志值 标志描述 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(不再重视) SET_FLAG 字段是SET(不再重视) BLOB_FLAG 字段是BLOB或TEXT(不再重视) TIMESTAMP_FLAG 字段是TIMESTAMP(不再重视)
3 API概述
API 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数 mysql_autocommit() 切换 autocommit模式,ON/OFF mysql_change_user() 更改打开连接上的用户和数据库 mysql_charset_name() 返回用于连接的默认字符集的名称 mysql_close() 关闭服务器连接 mysql_commit() 提交事务 mysql_connect() 连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代 mysql_create_db() 创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之 mysql_data_seek() 在查询结果集中查找属性行编号 mysql_debug() 用给定的字符串执行DBUG_PUSH mysql_drop_db() 撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之 mysql_dump_debug_info() 让服务器将调试信息写入日志 mysql_eof() 确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之 mysql_errno() 返回上次调用的MySQL函数的错误编号 mysql_error() 返回上次调用的MySQL函数的错误消息 mysql_escape_string() 为了用在SQL语句中,对特殊字符进行转义处理 mysql_fetch_field() 返回下一个表字段的类型 mysql_fetch_field_direct() 给定字段编号,返回表字段的类型 mysql_fetch_fields() 返回所有字段结构的数组 mysql_fetch_lengths() 返回当前行中所有列的长度 mysql_fetch_row() 从结果集中获取下一行 mysql_field_seek() 将列光标置于指定的列 mysql_field_count() 返回上次执行语句的结果列的数目 mysql_field_tell() 返回上次mysql_fetch_field()所使用字段光标的位置 mysql_free_result() 释放结果集使用的内存 mysql_get_client_info() 以字符串形式返回客户端版本信息 mysql_get_client_version() 以整数形式返回客户端版本信息 mysql_get_host_info() 返回描述连接的字符串 mysql_get_server_version() 以整数形式返回服务器的版本号 mysql_get_proto_info() 返回连接所使用的协议版本 mysql_get_server_info() 返回服务器的版本号 mysql_info() 返回关于最近所执行查询的信息 mysql_init() 获取或初始化MYSQL结构 mysql_insert_id() 返回上一个查询为AUTO_INCREMENT列生成的ID mysql_kill() 杀死给定的线程 mysql_library_end() 最终确定MySQL C API库 mysql_library_init() 初始化MySQL C API库 mysql_list_dbs() 返回与简单正则表达式匹配的数据库名称 mysql_list_fields() 返回与简单正则表达式匹配的字段名称 mysql_list_processes() 返回当前服务器线程的列表 mysql_list_tables() 返回与简单正则表达式匹配的表名 mysql_more_results() 检查是否还存在其他结果 mysql_next_result() 在多语句执行过程中返回/初始化下一个结果 mysql_num_fields() 返回结果集中的列数 mysql_num_rows() 返回结果集中的行数 mysql_options() 为mysql_connect()设置连接选项 mysql_ping() 检查与服务器的连接是否工作,如有必要重新连接 mysql_query() 执行指定为“以Null终结的字符串”的SQL查询 mysql_real_connect() 连接到MySQL服务器 mysql_real_escape_string() 考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理 mysql_real_query() 执行指定为计数字符串的SQL查询 mysql_refresh() 刷新或复位表和高速缓冲 mysql_reload() 通知服务器再次加载授权表 mysql_rollback() 回滚事务 mysql_row_seek() 使用从mysql_row_tell()返回的值,查找结果集中的行偏移 mysql_row_tell() 返回行光标位置 mysql_select_db() 选择数据库 mysql_server_end() 最终确定嵌入式服务器库 mysql_server_init() 初始化嵌入式服务器库 mysql_set_server_option() 为连接设置选项(如多语句) mysql_sqlstate() 返回关于上一个错误的SQLSTATE错误代码 mysql_shutdown() 关闭数据库服务器 mysql_stat() 以字符串形式返回服务器状态 mysql_store_result() 检索完整的结果集至客户端 mysql_thread_id() 返回当前线程ID mysql_thread_safe() 如果客户端已编译为线程安全的,返回1 mysql_use_result() 初始化逐行的结果集检索 mysql_warning_count() 返回上一个SQL语句的告警数
4 API详解
mysql_fetch_field
原型:MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
描述:返回采用MYSQL_FIELD结构的结果集的列信息。 参数: result:返回的结果集。 返回值:当前列的MYSQL_FIELD结构。如果未剩余任何列,返回NULL。
mysql_init
原型:MYSQL *mysql_init(MYSQL *mysql)
描述:分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。 返回值:初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。
mysql_num_fields
原型:unsigned int mysql_num_fields(MYSQL_RES *result)
描述:获取返回的结果集中有几列数据, 参数: result:返回的结果集。 返回值:结果集中的列数。
mysql_num_rows
原型:my_ulonglong mysql_num_rows(MYSQL_RES *result)
描述:获取返回的结果集中有几行数据。 参数: result:返回的结果集。 返回值:结果集中的行数。
mysql_options
原型:int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
描述:用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。 参数: mysql:初始化过的MYSQL结构。 arg:选项参数的值。 option:选项参数,说明如下表。 返回值:成功返回0,否则返回非0值。
选项 参量类型 功能 MYSQL_INIT_COMMAND char * 连接到MySQL服务器时将执行的命令。再次连接时将自动地再次执行。 MYSQL_OPT_COMPRESS 未使用 使用压缩客户端/服务器协议 MYSQL_OPT_CONNECT_TIMEOUT unsigned int * 以秒为单位的连接超时。 MYSQL_OPT_GUESS_CONNECTION 未使用 对于与libmysqld链接的应用程序,允许库“猜测”是否使用嵌入式服务器或远程服务器。“猜测”表示,如果设置了主机名但不是本地主机,将使用远程服务器。该行为是默认行为。 可使用MYSQL_OPT_USE_EMBEDDED_CONNECTION 和MYSQL_OPT_USE_REMOTE_CONNECTION覆盖它。对于与libmysqlclient链接的应用程序,该选项将被忽略。 MYSQL_OPT_LOCAL_INFILE 指向单元的可选指针 如果未给定指针,或指针指向“unsigned int != 0”,将允许命令LOAD LOCAL INFILE。 MYSQL_OPT_NAMED_PIPE 未使用 使用命名管道连接到NT平台上的MySQL服务器。 MYSQL_OPT_PROTOCOL unsigned int * 要使用的协议类型。应是mysql.h中定义的mysql_protocol_type的枚举值之一。 MYSQL_OPT_READ_TIMEOUT unsigned int * 从服务器读取信息的超时(目前仅在Windows平台的TCP/IP连接上有效)。 MYSQL_OPT_RECONNECT my_bool * 如果发现连接丢失,启动或禁止与服务器的自动再连接。从MySQL 5.0.3开始,默认情况下禁止再连接,这是5.0.13中的新选项,提供了一种以显式方式设置再连接行为的方法。 MYSQL_OPT_SET_CLIENT_IP char * 对于与libmysqld链接的应用程序(具备鉴定支持特性的已编译libmysqld),它意味着,出于鉴定目的,用户将被视为从指定的IP地址(指定为字符串)进行连接。对于与libmysqlclient链接的应用程序,,该选项将被忽略。 MYSQL_OPT_USE_EMBEDDED_CONNECTION 未使用 对于与libmysqld链接的应用程序,对于连接来说,它将强制使用嵌入式服务器。对于与libmysqlclient链接的应用程序,,该选项将被忽略。 MYSQL_OPT_USE_REMOTE_CONNECTION 未使用 对于与libmysqld链接的应用程序,对于连接来说,它将强制使用远程服务器。对于与libmysqlclient链接的应用程序,,该选项将被忽略。 MYSQL_OPT_USE_RESULT 未使用 不使用该选项。 MYSQL_OPT_WRITE_TIMEOUT unsigned int * 写入服务器的超时(目前仅在Windows平台的TCP/IP连接上有效)。 MYSQL_READ_DEFAULT_FILE char * 从命名选项文件而不是从my.cnf读取选项。 MYSQL_READ_DEFAULT_GROUP char * 从my.cnf或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名组读取选项。 MYSQL_REPORT_DATA_TRUNCATION my_bool * 通过MYSQL_BIND.error,对于预处理语句,允许或禁止通报数据截断错误(默认为禁止)。 MYSQL_SECURE_AUTH my_bool* 是否连接到不支持密码混编功能的服务器,在MySQL 4.1.1和更高版本中,使用了密码混编功能。 MYSQL_SET_CHARSET_DIR char* 指向包含字符集定义文件的目录的路径名。 MYSQL_SET_CHARSET_NAME char* 用作默认字符集的字符集的名称。 MYSQL_SHARED_MEMORY_BASE_NAME char* 命名为与服务器进行通信的共享内存对象。应与你打算连接的mysqld服务器使用的选项“-shared-memory-base-name”相同。
mysql_query
原型:int mysql_query(MYSQL *mysql, const char *query)
描述:查询指向的SQL查询,mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。 参数: mysql:由mysql_real_connect()连接成功的数据库 query:SQL查询语句,正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号 ; 或 \g 。如果允许多语句执行,字符串可包含多条由 ; 隔开的语句。 返回值:成功,返回0。错误,返回非0值。
mysql_real_connect
原型: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 long client_flag)
描述:尝试与运行在主机上的MySQL数据库引擎建立连接,在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,连接必须成功完成。 参数: mysql:由mysql_init()初始化成功的MYSQL结构的地址 host:主机名或IP地址 user:用户的MySQL登录ID passwd:用户的密码 db:数据库名称,如果db为NULL,连接会将默认的数据库设为该值 port:TCP/IP连接的端口号 unix_socket:如果不是NULL,则该字符串描述了应使用的套接字或命名管道 client_flag:值通常为0,也能将其设置为下述标志的组合,以允许特定功能:
标志名称 标志描述 CLIENT_COMPRESS 使用压缩协议。 CLIENT_FOUND_ROWS 返回发现的行数(匹配的),而不是受影响的行数。 CLIENT_IGNORE_SPACE 允许在函数名后使用空格。使所有的函数名成为保留字。 CLIENT_INTERACTIVE 关闭连接之前,允许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。 CLIENT_LOCAL_FILES 允许LOAD DATA LOCAL处理功能。 CLIENT_MULTI_STATEMENTS 通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。如果未设置该标志,将禁止多语句执行。 CLIENT_MULTI_RESULTS 通知服务器,客户端能够处理来自多语句执行或存储程序的多个结果集。如果设置了CLIENT_MULTI_STATEMENTS,将自动设置它。 CLIENT_NO_SCHEMA 禁止db_name.tbl_name.col_name语法。它用于ODBC。如果使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它很有用。 CLIENT_ODBC 客户端是ODBC客户端。它将mysqld变得更为ODBC友好。 CLIENT_SSL 使用SSL(加密协议)。该选项不应由应用程序设置,它是在客户端库内部设置的。