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

作者:HongDongJian 时间:2024-01-28 14:57:24 

一、使用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的字符集

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

解释下这几个参数:

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服务,再去查询字符集:

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

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

插入数据:

服务端将数据由客户端(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存储到磁盘,这时数据就是正常的

来源:https://www.cnblogs.com/dj3839/p/10610133.html

标签:jdbc,数据库,中文乱码
0
投稿

猜你喜欢

  • 在ASP.NET 2.0中操作数据之一:创建一个数据访问层

    2023-06-24 16:58:54
  • ORACLE实例的后台进程

    2024-01-12 17:58:34
  • python时间序列按频率生成日期的方法

    2021-10-04 22:38:40
  • SpringBoot集成内存数据库Sqlite的实践

    2024-01-15 10:24:11
  • python模糊图片过滤的方法

    2022-07-01 04:37:16
  • Django框架模板介绍

    2021-07-05 07:34:18
  • python opencv设置摄像头分辨率以及各个参数的方法

    2021-03-05 00:23:34
  • vue、react等单页面项目部署到服务器的方法及vue和react的区别

    2024-04-30 10:30:00
  • Python+Django搭建自己的blog网站

    2022-02-24 16:32:45
  • 利用Python实现Excel的文件间的数据匹配功能

    2023-12-04 19:53:42
  • Django 静态文件配置过程详解

    2021-07-08 07:27:53
  • 利用Python实现朋友圈中的九宫格图片效果

    2023-07-31 01:37:22
  • Python基于回溯法子集树模板解决马踏棋盘问题示例

    2021-08-01 15:45:43
  • Python基于TensorFlow接口实现深度学习神经网络回归

    2022-07-17 22:38:28
  • 前端之vue3使用WebSocket的详细步骤

    2024-04-30 10:28:54
  • Python实现复杂对象转JSON的方法示例

    2021-11-14 09:55:47
  • python线程join方法原理解析

    2021-02-02 04:49:01
  • Python fileinput模块使用介绍

    2023-08-22 14:32:12
  • MYSQL初学者使用指南[适用自己安装mysql者]

    2007-08-06 14:53:00
  • 由Python编写的MySQL管理工具代码实例

    2024-01-13 23:52:32
  • asp之家 网络编程 m.aspxhome.com