java通过jdbc插入中文到mysql显示异常(问号或者乱码)

首先本人菜鸡一个,如果有说错的地方,还请大家指出予批评

对于很多初学者来说,中文字符编码不相同的问题,是一个很烦躁的问题!!

因为很多时候,我们并不知道,到底是哪一层出现了问题?

在这里稍微做个总结~也怕自己今后忘了!!

 

其实也就三层:

1、前端页面

2、后台代码

3、数据库

记得考虑每一层之间的中文传递的问题,也就是前端传到后台,还有后台传到数据库!!

 

详解:

1、前端

前端就是设置页面的字符集

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

 

2、前端接受的数据传入后台

一般我们是通过request.getParameter("XXX")方式获取数据的,但是就算前端页面字符集是正确的,也有可能在这一层出现问题。

因为传递中文的时候,有可能用A编码拆解成Byte去传递,结果还原的时候使用B编码还原,这就导致原来的数据出现乱码或者???。。。等问题。

因此,我们可以通过String里面不同的构造方法来解决这个问题。(我们在第3部分,来修正这个问题)

 

3、后台代码

这里分为两块讲:

1)

先设置开发工具的编码类型,一般来说是默认是gbk,但是这里我用utf-8,所以就得修改

有两个地方要改:

a.Windows里面的Preferences(首选项框),在general里面找workspace,右侧有text file encoding,改为utf-8(这个是开发ide的字符集修改)

b.鼠标点击你的项目最顶层,然后在project里面找到这个项目的字符编码,改为utf-8(项目的字符集修改)

 

2)

因为我如上所说的问题,所以代码要在获取数据之前指明request和response的编码类型(我这里都用utf-8)

response.setContentType("text/html;charset=utf-8"); 
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

设置完成之后,可以这么获取中文字符!

String name = new String(request.getParameter("name").getBytes("utf-8"), "utf-8"))

这里写了两个utf-8大家就会有点迷茫,其实是这个意思,第一个utf-8是说明从前端拿过来的byte是什么编码格式的,第二个utf-8是指定把我的String字符串转换成什么编码格式。

一般来说使用new String(request.getParameter("name").getBytes(),"utf-8");就可以,尽量避免字符串的编码转来转去,这样会出现效率低下的问题,记得,先尝试用最简单的方式获取,然后在后台打印下它的值,如果显示正常,那么证明设置的没有问题!

关于后台代码,能改的差不多就这些

 

4、后台代码通过jdbc写sql将数据传入数据库(mysql为例)

 

这里还是有个比较恶心的地方,就是mysql如果你的字符集没有设置,或者没有设置好的话,默认是latin1

那么你的utf-8直接传过来还是会出问题。

因此mysql的url要这样写:

//useUnicode表示允许使用自定义的Unicode,
//characterEncoding是给定自定义的Unicode是什么
String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"

我之前遇到中文在数据库中显示???(问号)的问题,就是因为没有拼接上这两个参数。因此mysql解析从后台代码传过去的字符串的时候,通过编码类型去解析,所以就显示不出正确的中文!

 

5、最后一步就是mysql字符集的设置

其实应该先分清楚有哪些字符集可以设置?

1)mysql的某个库的字符集查看

可以通过use databasename;然后show variables like "%chara%"; 这个命令先查看下自己所使用的那个库的字符集都是什么

character_set_client为客户端编码方式;

character_set_connection为建立连接使用的编码方式;

character_set_database为数据库的编码方式;

character_set_results是结果集的编码方式;

character_set_server为数据库服务器的编码方式。

只要保证以上采用的编码方式一样,就不会出现乱码问题。

 

可以用如下的命令去修改:

set character_set_database="utf8"

以此类推,改成如上图所示(或者符合自己的要求即可)。

然后可能会出现重启完mysql修改的值就失效。可以在my.ini的文件中的[mysqld]标签中设置:

default-character-set=utf8(但是这个是老版本的设置方式,具体什么版本,没测过实在抱歉)

据说新版本是:character_set_server=utf8这个来代替之前的设置(大家可以自己尝试下哪个生效)

设置完之后,mysql重启下,应该字符编码就没问题了

 

2)mysql当中,用户所使用的某个数据库的字符集

这个就是创建数据库的时候设置的字符编码

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

utf8_general_ci是一种校对规则,有兴趣可以自己研究下。

也可以在连接工具上直接编辑数据库,来修改数据库的字符集!

 

3)某个具体数据库中的某张表的字符集

这个就是创建某张表的时候指定字符编码

CREATE TABLE mytable(

 id varchar(40) NOT NULL default '', 

 userId varchar(40) NOT NULL default ''

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

也可以在连接工具上直接改变表,来修改表的字符集!

其实就是把所有能改的地方全部改成utf-8(在数据库中是utf8,没有中间的  “ - ” ,千万别加上去了)

 

提醒下,记得遇到报错,要一层一层排错!

1、首先是前端传到后台的数据,在后台能正常打印吗?

 

2、其次是后台传输到数据库中的这个过程有没有问题?

 

3、数据库的字符编码都是一样的吗?

 

像2和3这两个方面,你可以拿一条带中文的数据,直接在数据库里面insert一条,如果插入进去,并且中文没有异常,证明数据库这边是没有问题的,那么就是传输时候的问题,很有可能是上述讲的url没有拼接那两条参数。

 

这里,转载一个大神的文章,我觉得这个说的很好:http://blog.youkuaiyun.com/cindy9902/article/details/6215769

以上,就是将大部分解决方法整理了下,如果全部设置了还不行,可以在下方留言,相互探讨相互学习!谢谢~

 

### Navicat 连接 MySQL 数据库汉字乱码解决方案 #### 1. 数据库层面的字符编码设置 在创建数据库时,需确保选择了合适的字符集和排序规则。推荐使用 `utf8` 或者更全面的 `utf8mb4` 编码[^3]。具体操作是在 Navicat 中新建数据库时,将字符集设定为 `utf8` 并选择对应的排序规则(如 `utf8_general_ci`)。这一步可以从根本上避免存储过程中出现的乱码。 #### 2. 客户端连接参数配置 当通过 Navicat 连接到 MySQL 数据库时,需要确认客户端使用的字符编码是否匹配服务器端的编码。可以通过修改连接属性中的高级选项实现这一点。例如,在 Navicat 的连接编辑窗口中找到“高级”部分,添加或调整以下参数: ```sql characterSetResults=utf8 ``` 此参数的作用是指定查询返回的结果集所采用的字符集为 UTF-8,从而防止因客户端默认编码不一致而导致的乱码现象[^2]。 #### 3. Java 应用程序与 MyBatis 配置 如果项目涉及 MyBatis 向 MySQL 插入数据,则还需要检查以下几个方面: - **IDE 和源文件编码**:开发环境(如 Eclipse、IntelliJ IDEA)以及 `.java` 文件本身的编码应统一设为 UTF-8。 - **MyBatis 配置文件**:在 MyBatis 的 XML 映射文件或其他相关配置中加入 JDBC URL 参数以强制指定字符集。例如: ```properties jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8 ``` 上述 URL 参数明确了使用 Unicode 及其具体的编码方式为 utf8,有助于减少潜在的编码冲突[^1]。 #### 4. 测试验证过程 完成以上各环节的调整之后,建议执行简单的插入和读取测试来检验效果。比如运行一段 SQL 脚本或者调用相应的 API 方法,观察实际存入的数据及其展示形式是否有异常情况发生。 ```sql INSERT INTO test_table (name) VALUES ('张三'); SELECT * FROM test_table; ``` 假如一切正常的话,“张三”的名字应该能够正确无误地被保存并呈现出来而不会变成问号或者其他奇怪符号。 ---
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值