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.csdn.net/cindy9902/article/details/6215769
以上,就是将大部分解决方法整理了下,如果全部设置了还不行,可以在下方留言,相互探讨相互学习!谢谢~
java通过jdbc插入中文到mysql显示乱码(问号或者乱码)的更多相关文章
- java通过jdbc插入中文到mysql显示异常(问号或者乱码)
转自:https://blog.csdn.net/lsr40/article/details/78736855 首先本人菜鸡一个,如果有说错的地方,还请大家指出予批评 对于很多初学者来说,中文字符编码 ...
- JAVA操作数据库插入中文表中显示乱码的解决方法
String dbUrl = "jdbc:mysql://localhost:3306/BookDB?useUnicode=true&characterEncoding=GB2312 ...
- MySQL 插入中文后,显示为空白
https://blog.csdn.net/sun_hj_95/article/details/79488583 在MySQL中插入中文后,显示如下: 解决方案: 在my.ini (在MySQL的安装 ...
- JAVA之JDBC的简单使用(Mysql)
JDBC增删查改 昨天七七八八的关于Mysql的配置 和 基本使用也算是初步解决了,今天 抽空看了JAVA的JDBC(JAVA DATA BASE CONNECTION)我也不知道我全称拼写对对不对
- MySQL问题记录--python插入中文至MySQL提示SQLErroor:1366错误
一.在爬虫脚本做以下操作仍提示错误:SQL Error: 1366: Incorrect string value: "\xd0\xc2\xce\xc5-" for column ...
- JDBC插入中文数据出现?号地解决问题
1. 查看jdbc配置是否指定编码 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/te ...
- Java代码批量插入数据到MySQL
1.批量插入 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundExc ...
- 使用C# 链接 Mysql 显示??? 乱码 的解决方案
下载以下文件 mysql-connector-odbc-5.3.6-win32.msi 下载并打开以下文件: mysql-installer-community-5.6.28.0.msi 安装mysq ...
- vc2008中mfc菜单、控件等汉字显示为问号或乱码的解决方法
在vc2008中建立基于mfc的project.在向导的Application type页面中如果在resource language选项中选择"英语(美国)"(图一),那么在pr ...
随机推荐
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- multi-task learning
多任务学习, CTR, CVR 任务同时训练, 同时输出概率.
- Nginx和php交互的两种方式
Unix socket 也叫IPC socket 也就是进程间通信套接字用于同一台主机上的不同进程间交换数据 TCP socket IP socket要利用主机的传输层(tcp),可以用于同一台主机 ...
- one_day_one_linuxCmd---tar命令
<坚持每天学习一个 linux 命令,今天我们来学习 tar 命令> 摘要:tar 命令是一个 Linux 下的打包程序,通常在 Linux 下,打包和压缩是不同的程序,打包通过 tar ...
- Codeforces Round #622 (Div. 2)C2 Skyscrapers最大"尖"性矩形,思维||分治
题:https://codeforces.com/contest/1313/problem/C2 题意:给出n个数,分别代表第i个位置所能搭建的最大高度,问以哪一个位置的塔的高度为基准向左的每一个塔都 ...
- UML-设计模式-本地服务容错-适配器+工厂模式
问题1:我们的ProductCatalog存储在了数据库里了,但是数据库瘫掉了,怎么办? 解决:本地(Map)---->Local(文件)---->DB 问题2:如果新加了存储Produc ...
- u-boot中filesize环境变量【转载】
转载地址:https://blog.csdn.net/fzs333/article/details/48518559 U-Boot中的环境命令可以使用$(filesize)来确定刚下载(传输)得到的文 ...
- javascript编程中极易出现的错误(个人)
2018-08-10 1,setInterval打错字写成ser 2,document.getElementById().innerHTML;HTML需要全部大写 3,在for循环中定义一个i时要记住 ...
- UML-逻辑架构&包图-相关概念
1.逻辑架构 软件的宏观组织结构.含: 1).包 2).子系统 3).层 2.层 对类.包.子系统的分组(内聚).例如:mvc.在OOA/D中要重点关注核心应用逻辑(或领域)层. 3.UML包图 描述 ...
- UML-SSD-为什么要画SSD?
需求文本看着过于抽象,采用SSD一目了然. 在设计软件之前,分析人员会关注系统会发生那些事件? 1.基本上,软件系统要对以下3种事件进行响应: 1).来自于参与者(人或计算机)的外部事件 2).时间事 ...