使用c语言操控mysql总结

该程序服务器端使用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也会释放内存,同一内存释放两次会导致程序崩溃。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值