• Linux下MySQL编程


    (转载)http://blog.chinaunix.net/uid-21347250-id-1827705.html

    在用源码安装mysql的情况下,源码将所有的都装了,包括mysql-server mysql-client mysql-dev mysql-debuge 等待。所以源码包会特别大,有100多M。
    而用rpm 包安装时,一般都没有安装debuge这个包。

    下面描述如何编译mysql C 的程序:

    -I include的路径。即欲链接到不在系统黑夜库下面的头文件时,需要将该路径包含进来。

    -L 库文件的路径。增加一个 -l 选项中库文件的查询路径,该路径下包含许多库文件,可供搜索。

    -l 库名。将与某个库文件链接,该库文件除了在系统默认的lib库文件夹下查找外,还将在 -L参数后跟着的库文件名下查找。

    编译程序时,分为汇编及链接。汇编即将头文件展开。链接则根据系统的动态链接库,链接并生成可执行文件。

    ******************************

    写了个连接mysql的main.c
    使用gcc
    -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -o main.o main.c编译时出错:
        不能找到文件mysqlclient

    gcc -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -lz -lcrypt -lnsl -lm -lmygcc -o main.o main.c

    可能你会注意到:/
    usr/local/mysql/lib的文件是以libmysql开头的文件,这是动态链接库的命名规则,以lib开头,以.so结尾。如果你用 -llibmysqlclient的话,那无将出错,找不到libmysqlclient这个文件,事实上,它是名为mysqlclient的动态链接库。

    几番周折,终于编译成功。但是,在运行时,还是找不到动态链接库。运行时,因为程序是动态链接的啊,所以,它将去找(lib)mysqlclient.so.16这个链接库,可是,在系统的默认链接库文件夹里头,是没有这个文件的。所以,系统有另外一个变量LD_LIBRARY_PATH,专门用来设置链接库夹的路径。如:
        export
    LD_LIBRARY_PATH=$MYSQL/lib:$LD_LIBRARY_PATH
    有了这个变量后,在运行时,就不会有找不到链接库mysqlclient.so.16这个错误了。

    但是,以下的代码在运行时,出现了段错误。这其中是什么原因我也不清楚了。真麻烦也。所以,干脆直接把mysql给删了,换个rpm安装更快.


    #include <mysql.h>
    #include <stdio.h>
    #include <stdlib.h>

    const char * host = "127.0.0.1";
    MYSQL * mysql;
    const char * user = "root";
    const char * password = "";

    int main(){

        mysql_init(mysql);

        mysql = mysql_real_connect(mysql,host,user,password,"mysql",0,NULL,0);

        if(!mysql){
                printf("connect error!\n");
                return EXIT_FAILURE;
        }



        return 0;
    }


    rpm没有下载下来。执行时出现段错误。这是程序的问题,而不是环境的问题。重新审视下自己,不可推搪的错误。调试是不行的了,至少我现在还不懂。
        段错误,又发生在函数调用(mysql_real_connect)上,肯定是引用了非法指针。最大的可能就是mysql了。
       
    mysql_init(mysql);改为mysql = mysql_init(mysql);
    这样就可以了!为什么呢?显得,返回的MYSQL*是调用mysql_init()后新创建的对象的地址。
        25.2.3.35. mysql_init()

    MYSQL *mysql_init(MYSQL *mysql)

    描述

    分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。

    这里,就是属于向mysql_init()传递了个null,因为MYSQL* mysql只是声明个指针,该指针是空着的。

    注意:笔者采取的是源码安装,mysql.h头文件在/usr/local/mysql/include/,mysqlclient库文件在/usr/local/mysql/lib/。

    在.bash_profile添加:
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib
    
    
    
    mysql.c文件内容:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include "/usr/local/mysql/include/mysql.h"
    
    const char* host = "127.0.0.1";
    MYSQL* mysql;
    MYSQL_RES* res;
    MYSQL_ROW* row;
    const char* user = "root";
    const char* password = "";
    
    int main(int argc ,char **argv)
    {
            int t, r;
    
            mysql = mysql_init(mysql);
            //mysql = mysql_real_connect(mysql, host, user, NULL, "mysql", 0, NULL, 0);
            //mysql = mysql_real_connect(mysql, host, user, password, "mysql", 0, NULL, 0);
            mysql = mysql_real_connect(mysql, host, user, password, "test", 0, NULL, 0);  // 这里使用MySQL默认数据库test
    
            if (!mysql)
            {
                    perror("MySQL connect error!\n");
                    return EXIT_FAILURE;
            }
    
            // 查询test数据库中的student表
            if (mysql_query(mysql, "select * from student"))
            {
                    perror("MySQL query error!\n");
                    return EXIT_FAILURE;
            }
            else
            {
                    res = mysql_use_result(mysql);
                    if (res)
                    {
                            for (r = 0; r <= mysql_field_count(mysql); r++)
                            {
                       // 每次读取一个元组(一行),知道row为NULL
    if ((row = mysql_fetch_row(res)) == NULL) break;
    // 输出一个元组的所有字段值
    for (t = 0; t < mysql_num_fields(res); t++) printf("%s ", row[t]); printf("\n"); } } mysql_free_result(res); // 释放结果集 }
         // 关闭MySQL连接 mysql_close(mysql); return
    0; }


    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    4 rows in set (0.14 sec)
    mysql> use test;
    Database changed

    mysql> insert into student values(23, 'Jack'), (29, 'Mike'), (12, 'Lili');
    Query OK, 3 rows affected (0.11 sec)
    Records: 3  Duplicates: 0  Warnings: 0



    mysql> select * from student;

    +------+------+

    | Id   | name |

    +------+------+

    |   23 | Jack |

    |   29 | Mike |

    |   12 | Lili |

    +------+------+

    3 rows in set (0.07 sec)

    mysql>

    [root@localhost ~]# gcc mysql.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient mysql.c
    [root@localhost ~]# ./a.out
    23 Jack
    29 Mike

    12 Lili
    [root@localhost ~]#

  • 相关阅读:
    zabbix 添加 微信、邮件 媒介详解
    zabbix使用之常用功能使用心得
    Nginx1.8源码包编译安装
    httpd启动显示Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName'
    apache-httpd2.4编译安装
    apache-httpd2.2编译安装
    MYSQL5.7源码包编译安装
    MYSQL常见安装错误集:[ERROR] --initialize specified but the data directory has files in it. Abort
    MYSQL启用数据库错误:ERROR 2002 (HY000)
    编译mysql时CMake Error at cmake/readline.cmake:85 (MESSAGE)
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3050099.html
Copyright © 2020-2023  润新知