一、使用jdbc连接数据库,插入数据库时,数据里的数据显示乱码,为 " ??? "

两种解决方案:

1、修改服务端的mysql配置文件,编辑my.cnf文件,在[mysqld]下添加一行character_set_server = utf8,然后重启mysql服务

2、使用jdbc连接时,指定正确的编码,jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8

二、为什么配置了character_set_server = utf8,jdbc连接时就可以不指定编码

查阅官方文档,jdbc在连接数据库时,会先查询服务端的character_set_server值,再确定连接时使用的编码。要想覆盖客户端的自动检测编码功能,可以使用characterEncoding属性

文档地址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-charsets.html

三、MYSQL的字符处理机制是怎样的,为什么jdbc不指定编码或者服务端不设置character_set_server=utf8会导致乱码

先查看下MYSQL的字符集

解释下这几个参数:

character_set_client:客户端来源数据使用的字符集
character_set_connection:连接层字符集
character_set_database:当前选中数据库的默认字符集
character_set_filesystem:把os上文件名转化成此字符集,默认binary是不做任何转换的
character_set_results:查询结果字符集
character_set_server:默认的内部操作字符集
character_set_system:系统元数据字符集
character_sets_dir:字符集的路径

修改服务端的mysql配置文件,编辑my.cnf文件,在[mysqld]下添加一行character_set_server = utf8,然后重启mysql服务,再去查询字符集:

然后了解下字符集转换流程:

插入数据:

服务端将数据由客户端(character_set_client)字符集转成character_set_connection,然后将character_set_connection字符集转成相应的字符集存储到磁盘中,这个相应的字符集会按照以下优先级来判断:

1、创建表时设置的字符集

2、创建库时设置的字符集

3、character_set_database字符集

3、character_set_server字符集

查询数据:

服务端将数据由存储在磁盘中的字符集,转换成character_set_results字符集,返回给客户端

然后分析下

1、jdbc不设置characterEncoding=utf8,服务端character_set_server为latin1,jdbc以latin1字符集连接数据库,数据库服务端将latin1转成utf8然后存储到磁盘(因为character_set_connection和创建表指定的字符集都是utf8),这时就造成了乱码

2、jdbc不设置characterEncoding=utf8,服务端character_set_server为utf8,或者jdbc设置characterEncoding=utf8,jdbc都以utf8字符集连接数据库,数据库服务端以utf8存储到磁盘,这时数据就是正常的

最新文章

  1. android json解析详细介绍之gson
  2. 【iHMI43 应用演示】之 modbus 协议(从机)通信演示
  3. mysql中在表中insert数据时,有重复主键id时,变成update
  4. APP测试时不可忽视搭建代理服务器抓包测试的必要性
  5. MySQL 优化方案
  6. 【转载】ADO.NET与ROM的比较(1):ADO.NET实现CRUD
  7. Repeater控件实现数据绑定,并实现分页效果
  8. 1.1.7-学习Opencv与MFC混合编程之---为画图工具添加工具栏
  9. Thrift入门初探(2)--thrift基础知识详解
  10. javascript封装的函数
  11. 【B2B】2015 年B2B的春天
  12. Python测试开发之函数
  13. 常用API接口汇总
  14. SSLv3存在严重设计缺陷漏洞(CVE-2014-3566)
  15. Systemd初始化进程/RHEL 6系统中System V init命令与RHEL 7系统中systemctl命令的对比
  16. jpa实例
  17. [转] 在安卓设备上使用 Chrome 远程调试功能
  18. vs2012\vs2013\vs2015碰到生成时报该错误:项目中不存在目标“GatherAllFilesToPublish”
  19. spine
  20. python 的集合 set()操作

热门文章

  1. 自动化运维工具sshd,expect,pssh,rsync详解
  2. JavaScript设计模式 Item 6 --单例模式Singleton
  3. linux系统安装mysql
  4. 理解Python中的yield
  5. [codeforces 804F. Fake bullions]
  6. BZOJ_2527_[Poi2011]Meteors_整体二分
  7. BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演
  8. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
  9. Java基础-抽象类和接口
  10. 浅谈surging服务引擎中的rabbitmq组件和容器化部署