`

Java连接MySQL乱码问题解决

阅读更多

在很久很久之前就解决过乱码问题,方法都是从网络上搜索来的。一直以来都是一知半解的。今天又费了将近两个小时来弄明白,至此刻还是不甚理解。

装Mysql时,设置的编码格式是utf8,即在my.ini里的设置显示为default-character-set=utf8 (共有2条语句,一条是客户端,一条是服务器端,貌似是这样子的说法)

在使用hibernate插件连接时,只要连接时使用如下语句就OK了。

jdbc:mysql://localhost:3306/javahomework?useUnicode=true&characterEncoding=UTF-8

而在java代码中,使用该方法插入时,无论数据库本身是utf8还是gbk,插入都是乱码。不得已修改了my.ini的default-character-set=utf8 为default-character-set=gbk .就行了。

在网上找到了如下两篇比较通俗易懂易操作的博文。如下所示:

Code:
  1. MySQL默认编码是latin1
  2. mysql>showvariableslike'character%';
  3. +--------------------------+--------------------------+
  4. |Variable_name|Value|
  5. +--------------------------+--------------------------+
  6. |character_set_client|latin1|
  7. |character_set_connection|latin1|
  8. |character_set_database|latin1|
  9. |character_set_filesystem|binary|
  10. |character_set_results|latin1|
  11. |character_set_server|latin1|
  12. |character_set_system|utf8|
  13. |character_sets_dir|D:/MySQL/share/charsets/|
  14. +--------------------------+--------------------------+
  15. 创建数据表并插入数据
  16. mysql>usetest;
  17. mysql>createtablemessages(
  18. ->idint(4)unsignedauto_incrementprimarykey,
  19. ->messagevarchar(50)notnull
  20. ->)engine=myisamdefaultcharset=utf8;
  21. mysql>insertintomessages(message)values("测试MySQL中文显示");mysql>select*frommessages;
  22. +----+-------------------+
  23. |id|message|
  24. +----+-------------------+
  25. |1|测试MySQL中文显示|
  26. +----+-------------------+
  27. 编写程序(Java)
  28. Java代码
  29. 1.importjava.sql.Connection;
  30. 2.importjava.sql.DriverManager;
  31. 3.importjava.sql.ResultSet;
  32. 4.importjava.sql.Statement;
  33. 5.publicclassJDBCTest{
  34. 6.publicstaticvoidmain(String[]args){
  35. 7.Stringdriver="com.mysql.jdbc.Driver";
  36. 8.Stringurl="jdbc:mysql://localhost:3306/test";
  37. 9.Stringuser="root";
  38. 10.Stringpassword="root";
  39. 11.try{
  40. 12.Class.forName(driver);
  41. 13.Connectionconn=DriverManager.getConnection(url,user,password);
  42. 14.Statementstmt=conn.createStatement();
  43. 15.stmt.executeUpdate("insertintomessages(message)values('测试MySQL编码')");
  44. 16.ResultSetrs=stmt.executeQuery("select*frommessages");
  45. 17.while(rs.next()){
  46. 18.intid=rs.getInt("id");
  47. 19.Stringmessage=rs.getString("message");
  48. 20.System.out.println(id+""+message);
  49. 21.}
  50. 22.rs.close();
  51. 23.stmt.close();
  52. 24.conn.close();
  53. 25.}catch(Exceptione){
  54. 26.e.printStackTrace();
  55. 27.}
  56. 28.}
  57. 29.}
  58. 30.程序输出1????MySQL????????2??MySQL??
  59. importjava.sql.Connection;
  60. importjava.sql.DriverManager;
  61. importjava.sql.ResultSet;
  62. importjava.sql.Statement;
  63. publicclassJDBCTest{
  64. publicstaticvoidmain(String[]args){
  65. Stringdriver="com.mysql.jdbc.Driver";
  66. Stringurl="jdbc:mysql://localhost:3306/test";
  67. Stringuser="root";
  68. Stringpassword="root";
  69. try{
  70. Class.forName(driver);
  71. Connectionconn=DriverManager.getConnection(url,user,password);
  72. Statementstmt=conn.createStatement();
  73. stmt.executeUpdate("insertintomessages(message)values('测试MySQL编码')");
  74. ResultSetrs=stmt.executeQuery("select*frommessages");
  75. while(rs.next()){
  76. intid=rs.getInt("id");
  77. Stringmessage=rs.getString("message");
  78. System.out.println(id+""+message);
  79. }
  80. rs.close();
  81. stmt.close();
  82. conn.close();
  83. }catch(Exceptione){
  84. e.printStackTrace();
  85. }
  86. }
  87. }
  88. 程序输出1????MySQL????????2??MySQL??
  89. 我们看到,尽管使用数据库时我们能够正常的添加和显示中文,但是在使用程序连接数据库时并不能够正常显示中文,为此我们需要修改MySQL的默认编码,编辑my.ini(MySQL配置文件)文件对编码进行修改
  90. 设置MySQL的默认字符集为utf8,找到客户端配置[client]在下面添加。
  91. default-character-set=utf8
  92. 找到服务器配置[mysqld]在下面添加
  93. default-character-set=utf8
  94. 设定MySQL数据库以utf8编码运行,连接MySQL数据库时使用utf8编码
  95. 停止和重新启动MySQL
  96. netstopmysql
  97. netstartmysql
  98. 重新连接数据库,查看编码,数据表内容
  99. mysql>showvariableslike'character%';
  100. +--------------------------+--------------------------+
  101. |Variable_name|Value|
  102. +--------------------------+--------------------------+
  103. |character_set_client|utf8|
  104. |character_set_connection|utf8|
  105. |character_set_database|utf8|
  106. |character_set_filesystem|binary|
  107. |character_set_results|utf8|
  108. |character_set_server|utf8|
  109. |character_set_system|utf8|
  110. |character_sets_dir|D:/MySQL/share/charsets/|
  111. +--------------------------+--------------------------+
  112. mysql>usetest;mysql>select*frommessages;
  113. +----+-------------------------------+
  114. |id|message|
  115. +----+-------------------------------+
  116. |1|虏芒脢脭MySQL脰脨脦脛脧脭脢戮|
  117. |2|??MySQL??|
  118. +----+-------------------------------+
  119. 这里显示依然是乱码主要是因为之前使用的编码不同造成的,
  120. 重新运行之前写的程序:
  121. javaJDBCTest1????MySQL????????2??MySQL??3测试MySQL编码
  122. 从第三条记录我们可以看到现在程序连接数据库时可以正常的添加和显示中文了
  123. mysql>select*frommessages;
  124. +----+-------------------------------+
  125. |id|message|
  126. +----+-------------------------------+
  127. |1|虏芒脢脭MySQL脰脨脦脛脧脭脢戮|
  128. |2|??MySQL??|
  129. |3|娴嬭瘯MySQL缂栫爜|
  130. +----+-------------------------------+
  131. 看回数据库的显示,我们会很奇怪的发现为什么显示的都是乱码,这主要是和windows下命令行的编码有关,在命令行上查看属性->选项的当前代码页:936(ANSI/OEM-简体中文GBK)(本人机子上是这样显示的)
  132. 也就是说命令行上使用的是GBK编码,而我们是在程序连接时使用utf8进行添加的,所以会出现有乱码,现在我们将客户端的编码改成gb2312或gbk试一下
  133. mysql>showvariableslike'character%';
  134. +--------------------------+--------------------------+
  135. |Variable_name|Value|
  136. +--------------------------+--------------------------+
  137. |character_set_client|gb2312|
  138. |character_set_connection|gb2312|
  139. |character_set_database|utf8|
  140. |character_set_filesystem|binary|
  141. |character_set_results|gb2312|
  142. |character_set_server|utf8|
  143. |character_set_system|utf8|
  144. |character_sets_dir|D:/MySQL/share/charsets/|
  145. +--------------------------+--------------------------+
  146. mysql>usetest;mysql>select*frommessages;
  147. +----+-------------------+
  148. |id|message|
  149. +----+-------------------+
  150. |1|????MySQL????????|
  151. |2|??MySQL??|
  152. |3|测试MySQL编码|
  153. +----+-------------------+
  154. 现在可以看到中文正常显示了(主要是因为utf8也支持中文),所以当我们使用命令行工具连接数据库的时候最好将客户端的编码改一下,如果使用GUI的话就不必了,同时修改客户端的编码之后程序依然能够正常显示(以上两点已经测试)
  155. 所以如果在程序中要显示中文的话我们可以选用utf8,gb2312,gbk这三种编码,但是如果想在命令行添加中文数据或者查看的话就需要将客户端的编码设置为gb2312或gbk了,还是那句,CMD的编码有关

Code:
  1. 对初学者来说,java与MySQL的连接以及MySQL的中文乱码问题是两个比较头疼的问题。我刚做了一个小项目,对这两个问题也是绞尽脑汁,也是初学者,花了一番功夫去查网页,找答案。作为一个初学者,我也完全以初学者的立场叙述一下我遇到的问题以及其解决的方法。也望能给刚陷入次困境的朋友有些许帮助!
  2. 我用的版本:
  3. JDK:j2sdk1.5.0
  4. MySQL:mysql-5.0.41-win32_178
  5. JDBC驱动:mysql-connector-java-3.2.0-alpha-bin.jar
  6. 一、java与数据库的连接
  7. java与数据库的连接书上写有四种方法,我的理解其实从其实质上说就两种,一种建立JDBC-ODBC桥,通过ODBC数据源与数据库相连。另一种是纯java式的连接,通过java类库API驱动连接。以MySQL为例,这两种方法分别需要MySQL-ODBC驱动和MySQL-JDBC-ODBC驱动。我用的是第二种方法,当然也建议使用纯java式的连接,需要MySQL-JDBC-ODBC驱动,可以从网上下载。
  8. 首先需要把驱动放在jdk的安装目录的lib目录中,并在环境变量classpath中加上该jar包,其设置和jdk的classpath中dt.jar和tools.jar一样。
  9. 连接过程分三步:加载驱动程序;使用java.sql包中的Connection建立连接;由Connection对象产生Statement对象,然后Statement对象就可以调用其方法传递SQL语句了。
  10. 下面以一个具体的实例来测试我们的连接:
  11. importjava.sql.*;
  12. publicclassConnectToMySQLTest
  13. {
  14. publicstaticvoidmain(String[]args)
  15. {
  16. try
  17. {
  18. //加载驱动程序
  19. Class.forName("com.mysql.jdbc.Driver");
  20. //创建指定数据库的URL
  21. Stringurl="jdbc:mysql://localhost:3306/student";//student是创建的数据库的名字
  22. StringuserName="root";//root是MySQL默认的用户名
  23. Stringpassword="123";//123是你设置的MySQL密码
  24. //创建连接
  25. Connectionconn=DriverManager.getConnection(url,userName,password);
  26. //创建Statement对象
  27. Statementstmt=conn.createStatement();
  28. //Statement对象向数据库提交SQL语句
  29. stmt.execute("droptableifexistsstu");//若表stu存在则删除
  30. stmt.execute("createtablestu(idintnotnullprimarykey,namevarchar(20)notnull,sexvarchar(4))");//创建表stu
  31. //插入记录
  32. stmt.execute("insertintostuvalues(1,'aaa','boy')");
  33. stmt.execute("insertintostuvalues(2,'bbb','girl')");
  34. stmt.execute("insertintostuvalues(3,'ccc','girl')");
  35. //执行查询数据库操作,并返回查询的结果集
  36. ResultSetrs=stmt.executeQuery("select*fromstu");
  37. //将结果集表指针定位到第一条记录前
  38. rs.beforeFirst();
  39. //打印查询结果
  40. System.out.println("stu表的数据如下:");
  41. System.out.println("---------------------");
  42. System.out.println("学号/t姓名/t性别");
  43. System.out.println("---------------------");
  44. intnum;
  45. Stringname;
  46. Stringsex;
  47. while(rs.next())
  48. {
  49. num=rs.getInt("id");
  50. name=rs.getString("name");
  51. sex=rs.getString("sex");
  52. System.out.println(num+"/t"+name+"/t"+sex);
  53. }
  54. stmt.close();
  55. conn.close();
  56. }
  57. catch(Exceptione)
  58. {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. 在测试之前,你需要启动MySQL,在mysql命令窗口中输入:createdatabasestudent;回车建立student数据库,然后在命令提示符中编译运行ConnectToMySQLTest,即可出现如下结果:
  64. 二、MySQL中文乱码问题
  65. 首先我们先来做个测试:
  66. 上面的代码运行成功后,打开mysql命令窗口,在其中输入:usestudent;(回车选择数据库)
  67. select*fromstu;(回车出现如下查询结果)
  68. 然后把上面代码stmt.execute("insertintostuvalues(1,'aaa','boy')");中的'aaa'改为'张三',然后保存重新编译运行,运行的结果为:
  69. 我们再打开mysql命令窗口,因为刚才我们已经选择了student数据库,我们可以直接输入:select*fromstu;(回车查询)结果如下:
  70. 可以发现改成张三以后,运行结果正常显示,但mysql中却显示的是两个问号。
  71. MySQL默认的字符编码是latin1,与java对应的就是ISO-8859-1。所以要正确的显示我们的中文字符,只需要将MySQL的字符编码方式有latin1改成中文的就行了,改成“gbk”或"gb2312",修改的方法有两种:
  72. 一种是重新配置MySQL,在它的配置向导中有一项是让你选择字符的编码,你可以选择自定义选项,然后将其自定义为“gbk”或“gb2312”;
  73. 另一种是直接修改MySQL安装目录中的“my.ini”文件,在MySQL的安装目录下找到该文件,用记事本打开,在其中找到以下两句:
  74. [mysql]
  75. default-character-set=latin1
  76. [mysqld]
  77. ……
  78. ……
  79. default-character-set=latin1
  80. 分别将其中的latin1改成“gbk”即可,注意要用小写,听说大写不识别。
  81. 网上还有几种其他的方法,在这里也说一下,有一种是在连接数据的连接串中指定字符集和Unicode编码,他把数据库的URL写成:
  82. Stringurl="jdbc:mysql://localhost:3306/student?user=root&password=123&useUnicode=true&characterEncoding=gb2312";
  83. 这样写的目的是告诉驱动在与数据库进行转码的时候按照这种方式来转,从而避免乱码,这种方法只能解决从java从MySQL中取出数据输出时的乱码问题,但若从java中向MySQL中插入中文数据时,在MySQL中仍然显示的是乱码,因为你并没有修改MySQL的字符编码方式,它还是默认的latin1,所以中文仍然不能正常显示,换句话也就是说,若MySQL的编码方式是latin1,你java向其中插入中文时,在MySQL中永远是乱码,它只能正确显示在MySQL中直接向其插入的中文,从外界向其插入中文它是不能正常显示的。
  84. 还有一种方法是,再使java从MySQL中取出数据时让其由"latin1"转化为"gbk",从java向MySQL中插入数据时让其由"gbk"转化为"latin1",以取出数据为例,经过这样的转化:
  85. Stringname=newString(rst.getString("name").getBytes("ISO-8859-1"),"GBK");
  86. 这里注意:gbk在java中是大写,小写会出错。latin1在java中对应的是ISO-8859-1.
  87. 也可以写两个转化函数,在转化时通过调用函数去转化,这两个函数如下:
  88. importjava.io.UnsupportedEncodingException;
  89. //解决中文问题
  90. publicclassEncodingUtil{
  91. //从数据库取出用
  92. publicstaticStringlatin1ToGBK(Stringstr)
  93. {
  94. try{
  95. Stringtemp_p=str;
  96. byte[]temp_t=temp_p.getBytes("ISO-8859-1");
  97. Stringtemp=newString(temp_t,"GBK");
  98. returntemp;
  99. }catch(UnsupportedEncodingExceptionex){
  100. System.out.println(ex);
  101. return"";
  102. }
  103. }
  104. //存入中文数据时用
  105. publicstaticStringGBKToLatin1(Stringstr)
  106. {
  107. if(str==null)
  108. {
  109. str="";
  110. }
  111. else{
  112. try{
  113. str=newString(str.getBytes("GBK"),"ISO-8859-1");
  114. }
  115. catch(Exceptionex){
  116. ex.printStackTrace();
  117. }
  118. }
  119. returnstr;
  120. }
  121. }
  122. 但这种用于较少的数据库操作的话还行,若你要频繁的从数据库中存取数据,那么每一句存取的语句你都去调用方法去转化,那显然是行不通的。
  123. 写到这里,我再多说一点,我自己的理解对于后两种方法,应该是在早期驱动程序不完善的时候出现问题的解决方法,可能驱动程序中对两种编码的转化没有能很好的实现,从而导致的存取乱码问题,我在网上就见过有人通过修改mysql-jdbc驱动去解决问题,因为mysql-jdbc驱动是开放源码的,他通过修改程序,重新编译生成class文件,然后运行不出现任何问题,很牛的人。
  124. 我自己的理解认为:现在的驱动已经完善了,所以在存取数据库时,不会出现乱码问题,乱码问题只是数据库使用的编码方式若不是中文的,那么在向其插入中文数据时,它不能正确显示出来,我们只需修改数据库的编码方式即可OK了。
  125. 还有注意:不同版本的MySQL会有不同的结果,这个很奇怪,网上有人说MySQL数据库的东西都是二进制存放的,支持任何数据,当然包括中文,你在MySQL命令行下输入:
  126. insertintostuvalues(4,'李四','boy');
  127. select*fromstu;
  128. 会正确显示李四,而如果你在java中向其插入该条记录,再在MySQL中查看,就成??了,他的意思是证明了乱码出现的原因是在java与MySQL的连接部分,也即驱动不能正确转化。我在mysql-5.0.51a-win32中这样测试过,确实是这样的,但你在我们现在用的mysql-5.0.41-win32_178中测试,若MySQL编码为latin1时,在MySQL命令中插入中文记录时,会出现错误:ERROR:1366(HY000)Incorrectstringvalue:.....
  129. 也即在mysql-5.0.41-win32_178中,若编码为latin1时,它不让我们直接插入中文数据,但不知为何在mysql-5.0.51a-win32却可以,这是个疑问,有知人士可以给出解答,在这先谢了。

高亮显示方便学习。

分享到:
评论

相关推荐

    Java连接MySQL乱码问题解决.doc

    Java连接MySQL乱码问题解决

    Java连接过程中的MySQL中文乱码问题[整理].pdf

    Java连接过程中的MySQL中文乱码问题[整理].pdf

    Java连接过程中的MySQL中文乱码问题.pdf

    Java连接过程中的MySQL中文乱码问题.pdf

    java连接mysql数据库乱码的解决方法

    主要介绍通过java连接mysql数据库的时候,页面出现乱码,这里简单分享下解决方法, 需要的朋友可以参考下

    JSP连接MYSQL5的中文问题解决方法

    下面的讲解是在MYSQL5.0.18,TOMCAT5.0.28,驱动为mysql-connector-java-3.2.0-alpha-bin.jar及以上版本的情况下测试的JSP连接数据库的乱码问题,分两部分来看。

    治疗mysql乱码.txt

    将带有中文的数据插入通过java程序插入到表中,中文出现了乱码. 一开始以为是客户端连接时的字符编码不对.

    sqlite数据库存取中文乱码的全部解决方案

    sqlite数据库存取中文乱码的全部解决方案(包括其它数据库oracle+sqlserver+mysql) 数据库的连接方式、数据库里存放数据的字体编码、所选编程语言的缺省字体编码。如果在编程中遇到不能正确显示中文时、、、、

    MySQL5.0安装图解.docx

    昨天看同学用Java连接MySQL数据库的时候,出现了乱码,这是我不知道的,我马上上网去查JDBC连接MySQL的操作,发现在用JDBC方式连接MySQL数据库的时候要传递一个能解决乱码的参数,才能将不是乱码的数据插入到数据库...

    Java连接数据库步骤解析(Oracle、MySQL)

    本文主要介绍了Java连接Oracle数据库和MySQL数据库的步骤解析。具有很好的参考价值,需要的朋友一起来看下吧

    mysql安装过程

    昨天看同学用Java连接MySQL数据库的时候,出现了乱码,这是我不知道的,我马上上网去查JDBC连接MySQL的操作,发现在用JDBC方式连接MySQL数据库的时候要传递一个能解决乱码的参数,才能将不是乱码的数据插入到数据库...

    mql连接时出现的中文问题

    1.mysql启动时的字符集,在myini文件中配置 default-character-set=字符集 ,放在,[WinMySQLadmin]之上;...这四个方面构成了mysql中的中文编码比较混乱的局面,一个环节没有处理得当就容易出现中文的乱码问题.

    mysql 增删改查

    5、mysql保存或者修改时,中文会出现乱码,这时必须 在DbHelperMySQL类的 连接字中增加Charset=utf8;即 protected static string connectionString = "Server=localhost;User Id=root;Password=root;Persist ...

    struts-hibernate-sprint开发详解 乱码问题 连接池

    不会让大家后悔,里面介绍了连接池,dbutils的应用,struts-hibernate-sprint结合开发的实例详解,用的是sql server数据库,也可以改为mysql oracle只要改变数据库连接驱动和url即可。

    jsp+mysql学生信息管理系统

    (第四代)学生信息管理系统,没有中文乱码问题,部署简单,功能全。使用最新技术开发:eclipse2022,支持java:17or8,支持mysql:8.0or5.7or.56,tomcat:10 普通用户 具有按学号学好查询学生资料功能,普通用户必须先...

    java 上传下载功能例子 连接MSQL数据库

    java 上传下载功能例子。 很适合初学者理解,里面有我理解后的注释,测试可以通过。 数据库用的MySQL。 有过滤器的配置,不会出现中文乱码,还有URL编码设置文件名。

    Win7系统安装MySQL5.5.21图解教程

    昨天看同学用java连接MySQL数据库的时候,出现了乱码,这是我不知道的,我马上上网去查JDBC连接MySQL的操作,发现在用JDBC方式连接MySQL数据库的时候要传递一个能解决乱码的参数,才能将不是乱码的数据插入到数据库...

    《MyEclipse 6 Java 开发中文教程》前10章

    Tomcat JSP Web 开发中的乱码问题小结 164 第九章 开发Struts 1.x应用 166 9.1 介绍 166 9.2 创建Struts项目 168 9.2.1 创建Web项目 169 9.2.2 加入 Struts开发功能 169 9.3 使用Struts工具 171 9.3.1 Struts配置...

Global site tag (gtag.js) - Google Analytics