使用c语言操控mysql总结

    xiaoxiao2021-03-26  5

    该程序服务器端使用mysql数据库,c语言操控。qt其实也有操控mysql的api,但当时写程序还没学到那,只学过原生态api,所以就使用c了。

    mysql在vs2013下的配置:一般mysql安装后都有c语言操控库,在mysql安装目录下。选择ALT + F7进入属性VC++目录->包含目录,把MYSQL/Connector.C下include路径拷贝到包含目录内。拷贝Connector.C++下lib/opt路径到库目录。后进行静态库链接:#pragma comment(lib, "libmysql.lib")

    注意:mysql版本位数要和vs设置的位数一致,mysql是32位,vs必须是win32,mysql64位,vs需要配置x64,否则会导致链接错误。

    使用方法:定义MYSQL mysql->mysql_init(&mysql)->mysql_real_query(&mysql, ip地址,用户名,密码,可填0,可填0,可填0,可填0)即可连接上数据库。

    注意:声明MYSQL时不能声明为指针例如:MYSQL *mysql->mysql_init(mysql),这会使程序崩溃。malloc mysql应该可以,没试过。

    操控数据库使用mysql_query或mysql_real_query,后者比前者多一个参数size。前者依靠\0作为字符串截止符,后者依靠传入参数size作为截止符,因此如果要存储二进制数据必须使用mysql_real_query因为二进制数据可能含有\0字符,所以必须指明大小。

    该程序使用mysql存储聊天数据,因此应该使用mysql_real_escape_string,该函数能处理掉mysql系统关键字,例如如果聊天记录有双引号单引号程序插入数据到数据库可能失败甚至崩溃(sql注入)。

    mysql获取数据,先使用mysql_store_result获取全部数据(也可以用其他函数获取部分数据),然后while (result_row = mysql_fetch_row(result))循环获取数据,result_row[i]即为所要查询的数据。注意:result_row[i]所获取的数据全部为char*类型,即使想要查询的数据类型为int类型,查询结果也是char*类型。

    也可以使用mysql预处理语句使用流程如下

    MYSQL_STMT *stmt = mysql_stmt_init(&mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init()wrong\n"); return 0; } int i; string query = "insert into register values(?)"; if ( i = mysql_stmt_prepare(stmt, query.data(), query.size())) { fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(&mysql)); err_reason = "注册请求失败"; return 0; } 先初始化,后执行parpare语句,?号表示需要填充的数据。例如想执行insert into table valuse("hello")使用预处理语句: MYSQL_BIND params[10]; char buf[20] = "hello" memset(params, 0, sizeof(params)); params[0].buffer_type = MYSQL_TYPE_STRING; params[0].buffer = (void*)nam; params[0].buffer_length = strlen(nam); mysql_stmt_bind_param(stmt, params); 如果是绑定char*类型,buffer_len必须赋值,如果是绑定int类型值buffer_type使用MYSQL_TYPE_TINY,下面是mysql bind设置buffer_type的类型 类型值 类型描述 MYSQL_TYPE_TINY TINYINT字段 MYSQL_TYPE_SHORT SMALLINT字段 MYSQL_TYPE_LONG INTEGER或INT字段 MYSQL_TYPE_INT24 MEDIUMINT字段 MYSQL_TYPE_LONGLONG BIGINT字段 MYSQL_TYPE_DECIMAL DECIMAL或NUMERIC字段 MYSQL_TYPE_NEWDECIMAL 精度数学DECIMAL或NUMERIC MYSQL_TYPE_FLOAT FLOAT字段 MYSQL_TYPE_DOUBLE DOUBLE或REAL字段 MYSQL_TYPE_BIT BIT字段 MYSQL_TYPE_TIMESTAMP TIMESTAMP字段 MYSQL_TYPE_DATE DATE字段 MYSQL_TYPE_TIME TIME字段 MYSQL_TYPE_DATETIME DATETIME字段 MYSQL_TYPE_YEAR YEAR字段 MYSQL_TYPE_STRING CHAR字段 MYSQL_TYPE_VAR_STRING VARCHAR字段 MYSQL_TYPE_BLOB BLOB或TEXT字段(使用max_length来确定最大长度) MYSQL_TYPE_SET SET字段 MYSQL_TYPE_ENUM ENUM字段 MYSQL_TYPE_GEOMETRY Spatial字段 MYSQL_TYPE_NULL NULL-type字段 MYSQL_TYPE_CHAR 不再重视,用MYSQL_TYPE_TINY取代 注意:mysql bind后内部应该会释放被绑定buffer内存,所以c++不能用string.data()来绑定buffer,string内部作用域结束会释放内存,bind也会释放内存,同一内存释放两次会导致程序崩溃。

    转载请注明原文地址: https://ju.6miu.com/read-600422.html

    最新回复(0)