• Linux C连接Mysql


    首先确定系统上安装了GCC和MYSQL了没有,

    如果没有先安装.CentOS用

    yum -y install gcc

    yum -y install mysql-server

    此外还必须安装mysql-devel

    安装成功检测:

    [root@liu mysql]# rpm -qa | grep 'gcc'  
    libgcc-4.4.7-4.el6.x86_64
    gcc-4.4.7-4.el6.x86_64
    [root@liu mysql]# rpm -qa | grep 'mysql'
    mysql-5.1.73-3.el6_5.x86_64
    mysql-devel-5.1.73-3.el6_5.x86_64
    mysql-libs-5.1.73-3.el6_5.x86_64
    mysql-server-5.1.73-3.el6_5.x86_64

    然后启动mysql

    service mysqld start

    进入Mysql创建数据库和表

    mysql> create database c_test;
    mysql> use c_test
    CREATE TABLE `user` (
    `id`  int(11) NOT NULL AUTO_INCREMENT ,
    `name`  varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' ,
    PRIMARY KEY (`id`)
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    ;
    mysql> insert into user(name) values('张三'),('李四'),('王五');
    mysql> select * from user;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | 张三 |
    |  2 | 李四 |
    |  3 | 王五 |
    +----+--------+
    3 rows in set (0.00 sec)

    创建mysql.c

    /*
     ============================================================================
     Name        : connect.c
     Author      : 风飘无痕
     Version     :
     Copyright   : Your copyright notice
     Description : Connect Mysql
     ============================================================================
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <mysql/mysql.h>
    
    MYSQL *g_conn; // mysql 连接
    MYSQL_RES *g_res; // mysql 记录集
    MYSQL_ROW g_row; // 字符串数组,mysql 记录行
    
    #define MAX_BUF_SIZE 1024 // 缓冲区最大字节数
    
    const char *g_host_name = "localhost";
    const char *g_user_name = "root";
    const char *g_password = "123456";
    const char *g_db_name = "c_test";
    const unsigned int g_db_port = 3306;
    
    void print_mysql_error(const char *msg) { // 打印最后一次错误
        if (msg)
            printf("%s: %s
    ", msg, mysql_error(g_conn));
        else
            puts(mysql_error(g_conn));
    }
    
    int executesql(const char * sql) {
        /*query the database according the sql*/
        if (mysql_real_query(g_conn, sql, strlen(sql))) // 如果失败
            return -1; // 表示失败
    
        return 0; // 成功执行
    }
    
    
    int init_mysql() { // 初始化连接
        // init the database connection
        g_conn = mysql_init(NULL);
        
        /* connect the database */
        if(!mysql_real_connect(g_conn, g_host_name, g_user_name, g_password, g_db_name, g_db_port, NULL, 0)) // 如果失败
            return -1;
    
        // 是否连接已经可用
        //if (executesql("set names utf8")) // 如果失败
           // return -1;
        return 0; // 返回成功
    }
    
    
    int main(void) {
        if (init_mysql());
            print_mysql_error(NULL);
    
        char sql[MAX_BUF_SIZE];
    
        if (executesql(sql))
            print_mysql_error(NULL);
        if (executesql("select * from user")) // 句末没有分号
            print_mysql_error(NULL);
    
        g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集
    
        int iNum_rows = mysql_num_rows(g_res); // 得到记录的行数
        int iNum_fields = mysql_num_fields(g_res); // 得到记录的列数
    
        printf("共%d个记录,每个记录%d字段
    ", iNum_rows, iNum_fields);
    
        puts("id	name
    ");
    
        while ((g_row=mysql_fetch_row(g_res))) // 打印结果集
            printf("%s	%s
    ", g_row[0], g_row[1]); // 第一,第二字段
    
        mysql_free_result(g_res); // 释放结果集
    
        mysql_close(g_conn); // 关闭链接
    
        return EXIT_SUCCESS;
    }

    编译

    gcc -g -o mysql -I/usr/include/mysql/ connect.c -L/usr/lib64/mysql/ -lmysqlclient -lz

    编译的时候要注意用到2个路径,mysql.h和libmysqlclient.so的路径

    查找mysql.h路径

    [root@liu mysql]# find / -name 'mysql.h'  
    /usr/include/mysql/mysql.h
    [root@liu mysql]# find / -name '*mysqlclient*' 
    /usr/lib64/mysql/libmysqlclient_r.so.16.0.0
    /usr/lib64/mysql/libmysqlclient.so.16
    /usr/lib64/mysql/libmysqlclient_r.so.16
    /usr/lib64/mysql/libmysqlclient_r.so
    /usr/lib64/mysql/libmysqlclient.so
    /usr/lib64/mysql/libmysqlclient.so.16.0.0

    运行:

    [root@liu mysql]# ./mysql 

    运行结果:

    共3个记录,每个记录2字段
    id      name
    
    1       张三
    2       李四
    3       王五

    一定要保持数据表编码,C文件编码的一致性,否则会出现乱码

  • 相关阅读:
    maven 错误:读取 xxx.jar 时出错;invalid LOC header (bad signature) 1 错误
    设计模式总结篇系列:建造者模式(Builder)
    java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
    Rxlifecycle使用详解,解决RxJava内存泄露问题
    详细解析RxAndroid的使用方式
    Android开源项目:GifView——Android显示GIF动画
    Rxjava2的学习与总结
    Pycharm连接gitlab
    Pycharm+Django+Python+MySQL开发 后台管理数据库
    Django-Model操作数据库(增删改查、连表结构)
  • 原文地址:https://www.cnblogs.com/lywy510/p/3615710.html
Copyright © 2020-2023  润新知