jdbc连接数据库,中文出现乱码的问题
一、使用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存储到磁盘,这时数据就是正常的
最新文章
- android json解析详细介绍之gson
- 【iHMI43 应用演示】之 modbus 协议(从机)通信演示
- mysql中在表中insert数据时,有重复主键id时,变成update
- APP测试时不可忽视搭建代理服务器抓包测试的必要性
- MySQL 优化方案
- 【转载】ADO.NET与ROM的比较(1):ADO.NET实现CRUD
- Repeater控件实现数据绑定,并实现分页效果
- 1.1.7-学习Opencv与MFC混合编程之---为画图工具添加工具栏
- Thrift入门初探(2)--thrift基础知识详解
- javascript封装的函数
- 【B2B】2015 年B2B的春天
- Python测试开发之函数
- 常用API接口汇总
- SSLv3存在严重设计缺陷漏洞(CVE-2014-3566)
- Systemd初始化进程/RHEL 6系统中System V init命令与RHEL 7系统中systemctl命令的对比
- jpa实例
- [转] 在安卓设备上使用 Chrome 远程调试功能
- vs2012\vs2013\vs2015碰到生成时报该错误:项目中不存在目标“GatherAllFilesToPublish”
- spine
- python 的集合 set()操作
热门文章
- 自动化运维工具sshd,expect,pssh,rsync详解
- JavaScript设计模式 Item 6 --单例模式Singleton
- linux系统安装mysql
- 理解Python中的yield
- [codeforces 804F. Fake bullions]
- BZOJ_2527_[Poi2011]Meteors_整体二分
- BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
- Java基础-抽象类和接口
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署