`

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数据库时,可能会遇到一个常见的问题:字符编码不匹配导致的乱码问题。本篇文章将详细探讨这个问题,并提供一系列解决方案。 ###...

    java插入mysql中文乱码解决

    ### Java插入MySQL中文乱码解决 #### 一、问题背景 在使用Java应用程序与MySQL数据库交互的过程中,常常会遇到一个令人头疼的问题:中文字符在存储到数据库时出现乱码现象。这种现象通常发生在使用JDBC(Java ...

    java+mysql 乱码

    通过以上步骤,通常可以解决Java与MySQL交互过程中的中文乱码问题。记得在每个环节都要检查并确保编码的一致性,避免因编码不匹配导致的数据乱码。如果仍然存在问题,可能需要进一步检查其他可能导致乱码的因素,...

    mysql乱码问题解决

    ### MySQL乱码问题解决方案 在处理数据库操作时,字符集编码问题经常会导致数据展示或存储过程中出现乱码现象。MySQL作为广泛使用的开源关系型数据库管理系统之一,在实际应用中也难免会遇到字符集不匹配导致的数据...

    解决连接mysql中文显示乱码

    以下是对如何解决连接MySQL时中文显示乱码问题的详细解析。 ### 解决中文显示乱码的关键知识点 #### 1. **理解字符集和编码** 字符集(Character Set)是指用于表示文字的一系列符号集合,而编码(Encoding)则是将...

    java编程中乱码问题解决

    ### Java编程中乱码问题解决 在Java编程中,乱码问题是开发者经常遇到的一个难题,尤其是在处理中文或者其他非英文字符时。本文将详细介绍如何解决Java编程中常见的乱码问题,并提供具体的实例帮助读者理解。 ####...

    mysql乱码问题解决办法

    ### MySQL乱码问题解决办法 在使用MySQL的过程中,经常会出现字符显示乱码的问题,尤其是在处理中文数据时更为常见。本文将详细介绍如何通过多种途径解决MySQL中的乱码问题,包括更改MySQL服务器的字符集设置、调整...

    Java开发中文乱码问题解决

    总之,解决Java中的中文乱码问题,关键在于识别出问题所在的具体环节,然后根据该环节的特点选择合适的编码设置。理解字符编码的工作原理,以及如何在Java中操作字符编码,对于避免和解决乱码问题至关重要。在实际...

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

    总结来说,解决Java连接MySQL的中文乱码问题主要涉及以下几个方面: - 调整MySQL数据库和表的字符集至支持中文的编码,如UTF-8。 - 在Java连接字符串中使用`useUnicode=true`和`characterEncoding=utf8`参数。 - ...

    Java连MySQL乱码.rar

    在Java编程中,连接MySQL数据库并进行数据交互是一项常见的任务。然而,当处理包含中文字符的数据时,可能会遇到乱码问题。...通过阅读"Java连MySQL乱码.pdf"这份文档,你应该能够找到更具体的解决方案和技巧。

    MySQL中文乱码问题解决方案

    除了服务器端的配置外,还需要注意客户端连接MySQL时所使用的字符集。例如,在使用Java的JDBC驱动时,可以在连接字符串中指定字符集: ```java String url = "jdbc:mysql://localhost:3306/sample?useUnicode=true&...

    Mysql运行SQL语句中文乱码问题的解决方法

    例如,使用Java连接MySQL时,可以在连接URL中指定字符集: ```java String url = "jdbc:mysql://localhost:3306/newdb?useUnicode=true&characterEncoding=gbk"; ``` #### 五、运行SQL文件时的编码设置 对于通过...

    hibernate+mysql乱码问题

    总结来说,解决“hibernate+mysql乱码问题”需要从数据库层面、Hibernate配置、Java代码以及开发环境等多方面进行检查和调整。遵循统一的编码标准并确保所有组件之间的一致性是避免乱码的关键。通过上述方法,你可以...

    Java连MySQL乱码.pdf

    在Java编程中,连接MySQL数据库并处理中文乱码是一个常见的挑战,尤其是在开发涉及多语言内容的应用时。本文将深入探讨如何解决这个问题。 首先,我们来看Java与MySQL的连接过程。在Java中,我们通常使用JDBC(Java...

    Java乱码问题解决

    此时可以通过在代码中加入`request.setCharacterEncoding("GBK")`来解决问题: ```jsp request.setCharacterEncoding("GBK"); String str = request.getParameter("chStr"); if (str == null) { str = "无值"; } ...

    Mysql插入中文乱码问题解决

    - 在使用 Java 等语言连接 MySQL 数据库时,可以在 JDBC 连接字符串中添加 `useUnicode=true&characterEncoding=utf-8` 参数来指定使用 UTF-8 编码。示例: ```plaintext jdbc:mysql://localhost:3306/login?...

Global site tag (gtag.js) - Google Analytics