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

目录
  • 一、使用jdbc连接数据库,插入数据库时,数据里的数据显示乱码,为 " ??? "
  • 二、为什么配置了character_set_server = utf8,jdbc连接时就可以不指定编码
  • 三、MYSQL的字符处理机制是怎样的,为什么jdbc不指定编码或者服务端不设置character_set_server=utf8会导致乱码

一、使用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连接数据库中文乱码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Java实现先查询缓存再查询数据库

    目录 前言 栗子 思路分析 原理介绍 代码实现 项目代码 配置文件 项目结构 SpringBootQueryApplication.java Goods.java CacheSelector.java CacheService.java CacheServiceImpl.java GoodsService.java GoodsServiceImpl.java BaseUtil.java (核心类) 用法 第一次从数据中查询 第二次从缓存中查询 前言 在访问量大的时候,为了提高查询效率,我们会将数

  • Java通过数据库表生成实体类详细过程

    目录 项目背景 项目代码 使用说明 配置相关 swagger操作 目前的缺点 项目背景 最近在做的项目,涉及到数据库的操作了,之前做的是直接调用接口,不用做存库操作. 因此要增加大量特殊格式的实体类.比如我们用的是 JPA ,要增加一些注解,额外还有 lombok 的一些注解. 所以,这个项目的目的是,根据数据库中的某张表,生成与之对应的实体类.使用的技术是Freemarker 模板引擎,自定义了实体的模板. 最终的目标是,生成实体类的内容即可.有需要的朋友,可以改改,直接生成java文件.我这

  • 图数据库NebulaGraph的Java 数据解析实践与指导详解

    目录 愉快.干净的 Java 交互环境 通过调用 execute 方法获得不太容易懂的 ResultSet 对象 直接返回 JSON 的 executeJson 方法 结论 愉快.干净的 Java 交互环境 如何快速.即时.符合直觉地去处理 Nebula Java Client 中的数据解析?读这一篇就够了. 图数据库 NebulaGraph 的论坛和微信群里,有不少用户问及了 Java 客户端数据解析的问题.在本文教你一种简单的方式同返回结果交互,快速.即时地拿到解析数据. 本文最为关键步骤之

  • java连接postgresql数据库代码及maven配置方式

    目录 java连接postgresql代码及maven配置 maven依赖 Springboo连接数据库通用代码 创建连接并执行业务逻辑 数据库通用类 maven配置 java连接postgresql代码及maven配置 postgresql数据库有默认数据库用户postgres,密码安装库时自己输入: 当然也可以连接其他用户: maven依赖 db2依赖 <dependency>     <groupId>org.apache.commons</groupId>  

  • java开发中基于JDBC连接数据库实例总结

    本文实例讲述了java开发中基于JDBC连接数据库的方法.分享给大家供大家参考,具体如下: 创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }c

  • Java 如何使用JDBC连接数据库

    一.使用JDBC连接数据库 1.使用JDBC-ODBC桥驱动程序连接数据库 基本步骤: (1)加载并注册数据库驱动 (2)通过DriverManager获取数据库连接 (3)通过Connection对象获取Statement对象 (4)使用Statement接口执行SQL语句 (5)操作ResultSet结果集 (6)关闭连接,释放资源 2.下面进行代码演示 1.注册数据库驱动程序的语法格式如下: DriverManager.registerDriver(Driver driver) 或者 Cl

  • java中封装JDBC工具类的实例分析

    对于能够重复使用的代码,我们最好的方法是对它们进行封装,然后在下次使用的使用就可以直接调用了.本篇所要提到的是JDBC工具类,相信大家在学习java时都接触过.那么对于封装它的方法,本篇先对工具类进行简单的说明,列出有关的封装步骤,然后带来相关的实例. 1.说明 在java开发过程中,代码中时常用到一些Scanner.Random一样的类,他们是键盘录入,生成随机数的类,像一个工具一样,在java中被称为工具类. 2.步骤 封装JDBC工具类 加入获取数据库连接对象的方法 加入释放连接的方法 3

  • JQuery的Ajax中Post方法传递中文出现乱码的解决方法

    本文实例讲述了JQuery中Post传递中文出现的解决方法,即乱码ajax与jquery.ajax中文参数post传递乱码处理方法.分享给大家供大家参考.具体分析如下: 问题一: 今天在做项目时,需要用到Ajax,之前我在用GET方式传递中文参数时,只需要在后台程序中设置页面编码为GB2312即中文能正常显示,可是这次由于表单项目较多,不适合用GET方式传递,只能用POST方式,但发现后台程序中设置编码为GB2312时中文还是显示的乱码.经过一番研究问题才最终得到解决. 解决方法: 解决此问题的

  • Java中判断字符串是中文或者英文的工具类分享

    直接上代码: 复制代码 代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /**  *  * <p>  * ClassName ShowChineseInUnicodeBlock  * </p>  * <p>  * Description 提供判断字符串是中文或者是英文的一种思路  * </p>  *  * @author wangxu wangx89@126.com

  • 深入解析Java中的JDBC事务

    事务 事务是一步或多步组成操作序列组成的逻辑执行单元,这个序列要么全部执行,要么则全部放弃执行.事务的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(IsoIation)和持续性(Durability)原子性(Atomicity):事务应用最小的执行单元,不可再分.是事务中不可再分的最小逻辑执行体. 一致性(Consistency):事务的执行结果,必须使数据库的从一个一致性的状态变到另一个一致性的状态. 隔离线(IsoIation):各个事务的执行互不干扰,任

  • java中Filter过滤器处理中文乱码的方法

    注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处理乱码的格式不一致.所以编译出错. 解决方法:所有地方都用utf-8或gbk 复制代码 代码如下: //过滤器类CharactorFilter.jsppackage cn.com.Filter; import java.io.IOException; import javax.servlet.Fil

  • Java中使用JDBC操作数据库简单实例

    好久没有编写有关数据库应用程序啦,这里回顾一下java JDBC. 1.使用Java JDBC操作数据库一般需要6步: (1)建立JDBC桥接器,加载数据库驱动: (2)连接数据库,获得Connection对象(使用数据库连接地址,用户名,密码): (3)获得数据库Statement对象: (4)执行数据库操作: (5)读取结果: (6)关闭数据库连接: 2.使用Java JDBC操作数据库(mysql)代码: 连接mysql数据库,需要导入mysql数据库jar包,本代码使用mysql-con

  • Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录名及文件名中的中文显示为"??". 原因: FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码. 解决方案: 1.将中文的目录或文件名转为iso-8859-1编码的字符.参考代码: 复制代码 代码如下: String name="目录名或文件名"; name=new String(name.getBytes(&qu

  • Java编程中使用JDBC API连接数据库和创建程序的方法

    JDBC连接数据库 涉及到建立一个JDBC连接的编程是相当简单的.下面是这些简单的四个步骤: 导入JDBC包: 添加import语句到Java程序导入所需的类在Java代码中. 注册JDBC驱动程序:这一步会导致JVM加载所需的驱动程序实现到内存中,因此它可以实现JDBC请求. 数据库URL制定:这是创建格式正确的地址指向到要连接的数据库. 创建连接对象:最后,代码调用DriverManager对象的getConnection()方法来建立实际的数据库连接. 导入JDBC包: import 语句

随机推荐