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自动超时重连导致的中文乱码问题相关推荐

  1. Charset编码问题导致的中文乱码

    环境:POST方法.Content-Type: application/x-www-form-urlencoded;charset=utf-8(key=val&key2=val2形式) 调用接 ...

  2. mysql数据库进行更新、插入显示中文乱码问题

    很多种情况下,从数据库中查询出来的内容中文显示正确,但是如果向数据库中插入或更新表时,会出现中文乱码问题,但英文显示正确,以下三种方式可以解决中文乱码问题. 1.数据库连接的配置文件中添加charac ...

  3. 【开发环境】Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | \r\n换行 | Runtime 执行 Cmd 命令 )

    文章目录 Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 1.生成 bat 脚本注意事项 2.Java 执行 Cmd 命令 3.完整代码示例 4.执行结果 Java 文件生成 ...

  4. MySQL工作笔记-解决导入外部sql中文乱码问题

    比如把XX厂家的数据库导出sql语句后,导入到mysql可能会出现中文乱码的问题,如下图所示: 下面来说明下,解决这个问题! 首先修改Mysql库的编码(在中国基本上使用GBK编码): 然后在导入的S ...

  5. java locale中文_locale错误导致Java中文乱码错误的总结

    线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的.由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算 ...

  6. 火爆全网MySQL路线笔记!java文件读取中文乱码

    正文 模块(Module).组件(Component).包(Package),这些概念对于我们技术同学并不陌生,但并不是所有人都能理解其要义. 深入理解之后,我才发现,其背后的深意是分类思维.而这种分 ...

  7. mysql 通过echo的方式写入数据库 中文乱码解决方案

    echo "set names utf8;insert into xxx (path, sn, time, flag) values ('$wav', '$sn', '$secs', 'op ...

  8. 【记录】关于编码格式导致的中文乱码问题

    一. 问题描述 最近有个需求,解压压缩包提取其中的文件,处理rar.7z格式没啥问题,处理解压zip(项目中用的版本比较老)的时候,解压方法中需要传入编码格式,问题就来了. 使用windows系统打包 ...

  9. PyDev:修改代码模板自动添加encoding=utf8,避免中文乱码

    如果python代码中有中文则在代码最开始加上#coding=utf8,就可以解决了. 既然这样,在eclipse下可以修改python代码模板,就可以在每次创建一个新的python文件时自动加入这一 ...

最新文章

  1. Facebook曝至今最严重安全漏洞,超过5000万用户受影响
  2. 1.2、什么是函数?什么是方法
  3. Halcon:模版匹配
  4. 从命令式功能到纯功能性,然后再返回:Monads与范围内的延续
  5. 计算机的双一流学校,分数不够上双一流大学计算机专业,上这些大学也不错,实力非常强...
  6. 鸿蒙系统怎么还不能用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  7. linux 中间代码反编译,[原创]反编译原理(2)-中间表示
  8. 技术文章-Java类的继承
  9. 基于java的邮件服务器以及webmail的搭建
  10. python分类时特征选择_推荐 :使用Python实现机器学习特征选择的4种方法(附代码)...
  11. 大智慧705服务器文件夹,大智慧2文件目录结构.doc
  12. windows server 2000系统安装
  13. Android 应用瘦身
  14. 交通大数据干货总结(1)
  15. 史上最大入行软件测试月收入1万以上“骗局”来啦,防踩坑日记
  16. Linux系统学习方法
  17. 2022年最新美股上市SaaS公司前50名排行榜单
  18. 写一封给36岁沈阳出生女性名字叫植瑶的人一封情书
  19. Url跳转和伪静态html解决方案
  20. 蓝桥ROS机器人之命令行实践

热门文章

  1. EasyExcel基于一个Sheet模板导出多个Sheet
  2. 手机页面调用拨号的几种方法
  3. AttributeError: ‘ConvolutionalBoxPredictor‘ object has no attribute ‘inputs‘
  4. 华为nova刷Android10,华为nova(CAZ-AL10)6.0 ROM刷机包 极致精简流畅
  5. matlab程序,基于广义benders分解法的综合能源系统优化规划,关键词,综合能源系统规划,Benders分解
  6. 中国人遗传基因数据泄露,或提高生物武器准确性
  7. 省级科技企业孵化器应具备什么条件
  8. 聊聊刷题,让你事半功倍的编程笔记!
  9. python字符串拼接数字_Python字符串拼接数字的方法
  10. 【104期分享】4款简约风格PPT模板免费下载