文章目录
mysql连接问题:
①简述:Mysql网络断开重连问题,需要结合mysql_options的函数和mysql_ping函数
错误原因:断开网络后重新将mysql连接释放(mysql_close(MYSQL )),并重新初始化mysql_init((MYSQL )),然后再用mysql_real_conncet()函数进行连接,但是这样做的后果是mysql_real_connect()报错,报错内容为没有足够的内存,
————————————————
版权声明:本文为CSDN博主「fantasydreams」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fantasydreams/article/details/45459653
②问题:设置mysql自动重连问题,缺省值为8小时不用就会关闭连接
措施:
法一:增大/etc/my.cnf中wait_timeout的值,比如设置wait_timeout=8640000,即100天。这个值缺省是8小时。这个方法简单,但是不能彻底解决问题。推荐第二种解决方法。
法二:使用mysql_ping来自动检查重连。用到两个函数,一个是mysql_ping,另外一个是mysql_options。具体使用方法是在mysql_real_connect之前,mysql_init之后,使用mysql_options。用法如下
char value = 1;
(void) mysql_init (&mysql);
mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&value);
然后在以后mysql_query之前首先使用mysql_ping进行判断,如果连接已经断开,会自动重连。
链接:https://www.cnblogs.com/devcjq/articles/6082221.html
③生产环境中可能不会用到以上的方案,
- 原因:因为mysql_ping如果发现连接断开,自动重连的时候,所有锁会释放,不会自动再加上锁,但是重新mysql_real_connect的时候,会自动加上锁,所以一般都会只用mysql_real_connect避免一些其他的问题出现
④mysql批量插入数据量过大报错解决办法
- 报错简述
Packet for query is too large (6071393 > 4194304). You can change this value on the server by setting the max_allowed_packet’ variable.
- 解决方法
修改 my.ini 加上 max_allowed_packet =67108864
(备注:67108864=64M,默认大小4194304 也就是4M,修改完成之后要重启mysql服务,如果通过命令行修改就不用重启mysql服务。)
或
设置为500M
mysql> set global max_allowed_packet = 500*1024*1024;
或者
mysql> set global max_allowed_packet = 524288000;
登陆mysql,运行
show VARIABLES like '%max_allowed_packet%';
⑤mysql escape 函数_mysql_real_escape_string()函数的作用:防止SQL注入的方法
- 解释:
①该函数用于创建可在SQL语句中使用的合法SQL字符串。请参见9.1.1节,“字符串”。
②按照连接的当前字符集,将“from”中的字符串编码为转义SQL字符串。将结果置于“to”中,并添加1个终结用NULL字节。编码的字符为NUL (ASCII 0)、‘\n’、‘\r’、‘\’、‘’’、‘"’、以及Control-Z(请参见9.1节,“文字值”)。(严格地讲,MySQL仅需要反斜杠和引号字符,用于引用转义查询中的字符串。该函数能引用其他字符,从而使得它们在日志文件中具有更好的可读性)。
③“from”指向的字符串必须是长度字节“long”。必须为“to”缓冲区分配至少length*2+1字节。在最坏的情况下,每个字符或许需要使用2个字节进行编码,而且还需要终结Null字节。当mysql_real_escape_string()返回时,“to”的内容是由Null终结的字符串。返回值是编码字符串的长度,不包括终结用Null字符。
④如果需要更改连接的字符集,应使用mysql_set_character_set()函数,而不是执行SET NAMES (或SET CHARACTER SET)语句。mysql_set_character_set()的工作方式类似于SET NAMES,但它还能影响mysql_real_escape_string()所使用的字符集,而SET NAMES则不能。
- 代码
char query[1000],*end;
end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
补充说明:该示例中使用的strmov()函数包含在mysqlclient库中,工作方式与strcpy()类似,但会返回指向第1个参数终结用Null的指针。
- 返回值
返回置于“to”中的值的长度,不包括终结用Null字符。
- 可能产生的错误
无