关于Java中使用jdbc连接数据库中文出现乱码的问题

 更新时间:2023年04月14日 10:16:14   作者:HongDongJian  
这篇文章主要介绍了关于Java中使用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字符集

4、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存储到磁盘,这时数据就是正常的

到此这篇关于关于Java中使用jdbc连接数据库中文出现乱码的问题的文章就介绍到这了,更多相关jdbc连接数据库中文乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 数据库连接超时java处理的两种方式

    数据库连接超时java处理的两种方式

    这篇文章主要介绍了数据库连接超时java处理的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java之JFrame输出Helloworld实例

    Java之JFrame输出Helloworld实例

    这篇文章主要介绍了Java之JFrame输出Helloworld的方法,以输出Helloworld的实例分析了JFrame的简单入门技巧,需要的朋友可以参考下
    2015-02-02
  • java实现租车系统

    java实现租车系统

    这篇文章主要为大家详细介绍了java实现租车系统,以及遇到的两个问题解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java线程池队列PriorityBlockingQueue原理分析

    Java线程池队列PriorityBlockingQueue原理分析

    这篇文章主要介绍了Java线程池队列PriorityBlockingQueue原理分析,PriorityBlockingQueue队列是 JDK1.5 的时候出来的一个阻塞队列,但是该队列入队的时候是不会阻塞的,永远会加到队尾,需要的朋友可以参考下
    2023-12-12
  • java final本质详解

    java final本质详解

    在本篇文章里小编给大家分享的是关于java final本质的相关知识点内容,有需要的朋友们可以参考下。
    2019-09-09
  • Mybatis实现动态SQL编写的示例详解

    Mybatis实现动态SQL编写的示例详解

    这篇文章主要为大家详细介绍了mybatis中的动态sql的使用以及缓存的相关知识,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-02-02
  • 一文带你搞懂Java中线程的创建方式

    一文带你搞懂Java中线程的创建方式

    这篇文章主要为大家详细介绍了Java中线程的创建方式的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • java 自定义类比较器代码

    java 自定义类比较器代码

    这篇文章主要介绍了java 自定义类比较器代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • java连接SQL Server数据库的超详细教程

    java连接SQL Server数据库的超详细教程

    最近在java连接SQL数据库时会出现一些问题,所以这篇文章主要给大家介绍了关于java连接SQL Server数据库的超详细教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Mybatis基础概念与高级应用小结

    Mybatis基础概念与高级应用小结

    这篇文章主要介绍了Mybatis基础回顾与高级应用,本文内容有点小长,希望大家耐心阅读,此文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论