Mysql自动超时重连导致的中文乱码问题
Mysql自动超时重连导致的中文乱码问题
今天有客户反应从自选股服务器获取的自定义板块中文名称乱码,之前一直都是正常的。看到乱码两字,头脑中首先冒出来的就是查看mysql数据库中的编码集,输入SHOW VARIABLES LIKE ‘char%’;命令查看编码全部都是utf编码,没有问题。
再查看服务器日志:
服务器运行过程中没有进行重启,也没有错误日志,但是日志中显示有长达八个多小时(日志打印的是0时区的,把这个时间加上8小时就是我们的北京时间)没有进行过数据流的交互,因为我们是股票行情软件,在凌晨到早上9点开市前基本不会有活跃的用户,看到这,立马想到了mysql的自动超时重连导致之前的编码设置无效。
使用mysql C API时,由于数据库中的编码都是utf8的,因此我们也需要在调用api时指定连接字符集,而这个是通过SET NAMES来实现的。由于我们的服务器连接数据库时通过mysql_options指定了MYSQL_OPT_RECONNECT超时重连选项,在每次执行sql语句之前先执行一次mysql_ping,来自动检查重连。当开启了自动重连,连接断开时,会尝试重新连接数据库,重新连接虽然好用,但是也会存在以下问题:
- 任何活动的交易都被回滚,autocommit模式被置为reset。
- 所有表锁都释放
- 所有临时表是关闭(撤消)
- Session variables are reinitialized to the values of the corresponding variables.会话变量被重新初始化为相应的变量。 这也影响那些隐式声明的变量,比如使用SET NAMES。This also affects variables that are set implicitly by statements such as SET NAMES.
- 用户变量设置都将丢失。
- 编制报表释放。
- 句柄变量被关闭。
- LAST_INSERT_ID()被重置为0 。
- 使用GET_LOCK()获得的锁被释放
第四点和第五点可以一起理解,即当mysql的连接进行自动重连时,之前针对一个连接进行的用户设置都将失效,比如使用SET NAMES。而我们服务器恰好是通过mysql_query(pSqlCon, “SET NAMES UTF8”);实现的。
那如何解决重连之后的编码设置问题呢?mysql c api还提供了另一种方式:MYSQL_SET_CHARSET_NAM。初始化数据库句柄后马上用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,这样就不用显式地用 SET NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8。代码如下:
问题解决了,虽然是一个较常见的坑,但还是被自己踩到了。针对mysql的自动重连和mysql的字符集做以下几点总结:
1, my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用,因此我们在调用MySQL c api时还需要指定连接字符集。
2, mysql的默认连接超时时间是28800s,也就是八小时,通过命令show variables like ‘%timeout%’;可以查看wait_timeout字段。也可以通过修改/etc/my.cnf中的wait_timeout值来解决这个问题,但是不能根治。
3, mysql默认编码是latin1,当数据库和连接字符集都使用latin1时,大部分情况下都可以解决乱码问题,但是却无法以字符为单位来进行SQL操作,一般情况下将数据库和连接字符集都置为utf8是较好的选择
4, 通过设置MYSQL_OPT_RECONNECT开启mysql的自动重连功能后,针对mysql的相关变量尽可能都使用mysql_options结合mysql_option枚举进行设置,避免重连后的设置无效。
Mysql自动超时重连导致的中文乱码问题相关推荐
- Charset编码问题导致的中文乱码
环境:POST方法.Content-Type: application/x-www-form-urlencoded;charset=utf-8(key=val&key2=val2形式) 调用接 ...
- mysql数据库进行更新、插入显示中文乱码问题
很多种情况下,从数据库中查询出来的内容中文显示正确,但是如果向数据库中插入或更新表时,会出现中文乱码问题,但英文显示正确,以下三种方式可以解决中文乱码问题. 1.数据库连接的配置文件中添加charac ...
- 【开发环境】Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | \r\n换行 | Runtime 执行 Cmd 命令 )
文章目录 Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 1.生成 bat 脚本注意事项 2.Java 执行 Cmd 命令 3.完整代码示例 4.执行结果 Java 文件生成 ...
- MySQL工作笔记-解决导入外部sql中文乱码问题
比如把XX厂家的数据库导出sql语句后,导入到mysql可能会出现中文乱码的问题,如下图所示: 下面来说明下,解决这个问题! 首先修改Mysql库的编码(在中国基本上使用GBK编码): 然后在导入的S ...
- java locale中文_locale错误导致Java中文乱码错误的总结
线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的.由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算 ...
- 火爆全网MySQL路线笔记!java文件读取中文乱码
正文 模块(Module).组件(Component).包(Package),这些概念对于我们技术同学并不陌生,但并不是所有人都能理解其要义. 深入理解之后,我才发现,其背后的深意是分类思维.而这种分 ...
- mysql 通过echo的方式写入数据库 中文乱码解决方案
echo "set names utf8;insert into xxx (path, sn, time, flag) values ('$wav', '$sn', '$secs', 'op ...
- 【记录】关于编码格式导致的中文乱码问题
一. 问题描述 最近有个需求,解压压缩包提取其中的文件,处理rar.7z格式没啥问题,处理解压zip(项目中用的版本比较老)的时候,解压方法中需要传入编码格式,问题就来了. 使用windows系统打包 ...
- PyDev:修改代码模板自动添加encoding=utf8,避免中文乱码
如果python代码中有中文则在代码最开始加上#coding=utf8,就可以解决了. 既然这样,在eclipse下可以修改python代码模板,就可以在每次创建一个新的python文件时自动加入这一 ...
最新文章
- Facebook曝至今最严重安全漏洞,超过5000万用户受影响
- 1.2、什么是函数?什么是方法
- Halcon:模版匹配
- 从命令式功能到纯功能性,然后再返回:Monads与范围内的延续
- 计算机的双一流学校,分数不够上双一流大学计算机专业,上这些大学也不错,实力非常强...
- 鸿蒙系统怎么还不能用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可
!【手机吧】_百度贴吧...
- linux 中间代码反编译,[原创]反编译原理(2)-中间表示
- 技术文章-Java类的继承
- 基于java的邮件服务器以及webmail的搭建
- python分类时特征选择_推荐 :使用Python实现机器学习特征选择的4种方法(附代码)...
- 大智慧705服务器文件夹,大智慧2文件目录结构.doc
- windows server 2000系统安装
- Android 应用瘦身
- 交通大数据干货总结(1)
- 史上最大入行软件测试月收入1万以上“骗局”来啦,防踩坑日记
- Linux系统学习方法
- 2022年最新美股上市SaaS公司前50名排行榜单
- 写一封给36岁沈阳出生女性名字叫植瑶的人一封情书
- Url跳转和伪静态html解决方案
- 蓝桥ROS机器人之命令行实践
热门文章
- EasyExcel基于一个Sheet模板导出多个Sheet
- 手机页面调用拨号的几种方法
- AttributeError: ‘ConvolutionalBoxPredictor‘ object has no attribute ‘inputs‘
- 华为nova刷Android10,华为nova(CAZ-AL10)6.0 ROM刷机包 极致精简流畅
- matlab程序,基于广义benders分解法的综合能源系统优化规划,关键词,综合能源系统规划,Benders分解
- 中国人遗传基因数据泄露,或提高生物武器准确性
- 省级科技企业孵化器应具备什么条件
- 聊聊刷题,让你事半功倍的编程笔记!
- python字符串拼接数字_Python字符串拼接数字的方法
- 【104期分享】4款简约风格PPT模板免费下载