zoukankan      html  css  js  c++  java
  • mysql编程

    首先安装mysql数据库及其动态链接库,

    sudo apt-get install mysql-server

    sudo apt-get install mysql-client

    sudo apt-get install libmysqlclient-dev

    安装过程很简单,根据提示安装即可

    有一些对象我们要先知道一下

    MYSQL :结构体,是我们连接数据库,操作数据库重要的对象

    typedef struct st_mysql
    {
    NET net; /* Communication parameters 通讯参数,网络相关*/
    unsigned char *connector_fd; /* ConnectorFd for SSL 加密套接字协议层*/
    char *host,*user,*passwd,*unix_socket,*server_version,*host_info; /*数据库用户名,密码,主机名,Unix套接字,版本,主机信息*/
    char *info, *db;
    struct charset_info_st *charset;
    MYSQL_FIELD *fields; /*字段列表*/
    MEM_ROOT field_alloc;
    my_ulonglong affected_rows;
    my_ulonglong insert_id; /* id if insert on table with NEXTNR 下一条记录的ID*/
    my_ulonglong extra_info; /* Not used 未使用*/
    unsigned long thread_id; /* Id for connection in server 数据库服务器中的连接ID*/
    unsigned long packet_length;
    unsigned int port; /*端口*/
    unsigned long client_flag,server_capabilities; /*客户端状态,服务器服务*/
    unsigned int protocol_version; /*协议版本*/
    unsigned int field_count; /*字段个数*/
    unsigned int server_status; /*数据库状态*/
    unsigned int server_language; /*数据库语言*/
    unsigned int warning_count; /*错误条数*/
    struct st_mysql_options options; /*后续学习*/
    enum mysql_status status;
    my_bool free_me; /* If free in mysql_close 是否关闭*/
    my_bool reconnect; /* set to 1 if automatic reconnect 是否自动连接*/
    /* session-wide random string */
    char scramble[SCRAMBLE_LENGTH+1];
    /*
    Set if this is the original connection, not a master or a slave we have
    added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
    */
    my_bool rpl_pivot;
    /*
    Pointers to the master, and the next slave connections, points to
    itself if lone connection.
    */
    struct st_mysql* master, *next_slave; /*系统数据库,自定义数据哭*/
    struct st_mysql* last_used_slave; /* needed for round-robin slave pick 端节点数据库*/
    /* needed for send/read/store/use result to work correctly with replication */
    struct st_mysql* last_used_con; /*最后一个连接*/
    LIST *stmts; /* list of all statements 执行语句*/
    const struct st_mysql_methods *methods; /*所有方法*/
    void *thd;
    /*
    Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag
    from mysql_stmt_close if close had to cancel result set of this object.
    */
    my_bool *unbuffered_fetch_owner;
    /* needed for embedded server - no net buffer to store the 'info' */
    char *info_buffer;
    void *extension;
    } 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; /* column lengths of current row 当前行的长度*/
    MYSQL *handle; /* for unbuffered reads 待续*/
    const struct st_mysql_methods *methods; /*方法*/
    MYSQL_ROW row; /* If unbuffered read 下条将行缓存的行*/
    MYSQL_ROW current_row; /* buffer to current row 当前行*/
    MEM_ROOT field_alloc; /*内存相关 待续*/
    unsigned int field_count, current_field; /*字段个数,当前字段*/
    my_bool eof; /* Used by mysql_fetch_row 是否是最后一条记录*/
    /* mysql_stmt_close() had to cancel this result */
    my_bool unbuffered_fetch_cancelled;
    void *extension;
    } MYSQL_RES;

    MYSQL_ROW:结构体,返回的结果的单行数据

    typedef char **MYSQL_ROW

    然后就是一些函数来进行操作所有头文件均为<mysql/mysql.h>

    MYSQL *mysql_init(MYSQL *mysql);

    初始化MYSQL对象的指针.

    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 *mysql:上面初始化以后的MYSQL对象指针

    const char *host:数据库的地址

     const char *user:数据库登陆的用户名

    const char *passwd:该用户的密码

    const char *db:登陆的数据库名称

    unsigned int port:端口号,根据host类型来决定,如果是本地的则为0

    const char *unix_socket:网络类型,本地为NULL

    unsigned long client_flag:连接属性,通常为0.

    以下是client_flag的取值:

    1. can_handle_expired_passwords客户机可以处理过期的密码
    2. client_compress使用压缩在客户端/服务器协议。
    3. client_found_rows返回发现(匹配)的行数,而不是改变的行数。
    4. client_ignore_sigpipe阻止客户端库安装一个SIGPIPE信号处理程序。这可以用来避免冲突的处理程序已经安装的应用程序。
    5. client_ignore_space允许空间。使所有的函数名称保留字。
    6. client_interactive允许interactive_timeout秒的静止(而不是wait_timeout秒)在关闭连接之前。客户的会话wait_timeout变量设置为会话interactive_timeout变量的值。
    7. client_local_files启用数据加载本地处理。
    8. client_multi_results告诉服务器,客户端可以处理多个结果集由多个语句执行或存储过程。这个标志是自动启用CLIENT_MULTI_STATEMENTS是否启用。有关更多信息,请参见此表后注意这个标志。
    9. client_multi_statements告诉服务器,客户端可以发送多个语句在一个字符串(隔开;字符)。如果没有设置这个标志,多个语句执行是禁用的。有关更多信息,请参见此表后注意这个标志。
    10. client_no_schema不允许db_name.tbl_name。col_name语法。这是对于ODBC。它使解析器生成一个错误如果你使用语法,这是用于捕获错误在某些ODBC程序。
    11. client_odbc未使用。
    12. client_ssl(使用SSL加密的协议)。不设置这个选项在一个应用程序,它被设置在内部在客户端库。相反,使用mysql_ssl_set()调用之前mysql_real_connect()。
    13. client_remember_options记住选项指定调用mysql_options()。没有这个选项,如果mysql_real_connect()失败,你必须重复mysql_options()调用之前再次尝试连接。采用这一选项,mysql_options()调用不需要重复。

    const char *mysql_error(MYSQL *mysql)

    输出错误信息

    int mysql_query(MYSQL *mysql, const char *stmt_str)

    用于执行sql语句,第二个参数就是sql语句,语句中不能以";"结尾,如果是多条语句用分号隔开.

    返回值:

      成功:0

      错误返回错误码

      可以使用mysql_error()函数查看错误详情

    MYSQL_RES *mysql_use_result(MYSQL *mysql)

    返回查询结果

    MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

    读取结果集中的下一行数据,返回为NULL时表示所有的数据经读取完了

    unsigned int mysql_num_fields(MYSQL_RES *result)

    返回结果集的行数

    void mysql_close(MYSQL *mysql)

    关闭连接,释放空间

    void mysql_free_result(MYSQL_RES *result)

    释放结果集的空间

    更多的函数可以查看官方文档,写的非常的详细

    简单的代码

    /**我觉得这个代码够简单了,所以就不写注释了*/
    #include <mysql.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[]){
        MYSQL *conn = NULL;
        MYSQL_RES *res = NULL;
        MYSQL_ROW row = NULL;
    
        char server_addr[]  = "localhost";
        char user[] = "root";
        char password[] = "123";
        char database[] = "test";
    
        conn = mysql_init(NULL);
        mysql_real_connect(conn,server_addr,user,password,database,0,NULL,0);
        if(conn == NULL){
            perror(mysql_error(conn));
            exit(1);
        }
    
        if(mysql_query(conn,"show tables")){
            perror(mysql_error(conn));
            exit(1);
        }
    
        res = mysql_use_result(conn);
        while( ( row = mysql_fetch_row(res) ) != NULL ){    
            printf("%s
    ",row[0]);
        }
    
        mysql_free_result(res);
        mysql_close(conn);
    
        return 0;
    }
  • 相关阅读:
    Linux 切换用户
    Java之.jdk安装-Linux
    Java之.jdk安装-Windows
    java注解生成xml和包含CDATA问题
    Spring学习—生成图片验证码
    java学习——java按值传递和按址传递
    温水中被煮熟的程序员-人生的思考
    mysql操作sql的小技巧
    java的classLoader分析与jettty的WebAppClassLoader
    深入Spring:自定义事务管理
  • 原文地址:https://www.cnblogs.com/CHYI1/p/5581268.html
Copyright © 2011-2022 走看看