加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Java连接MySQL中文乱码处理 character_set_server永久设置

(2012-07-19 13:30:23)
标签:

杂谈

分类: database
Java连接MySQL中文乱码处理
    http://developer.51cto.com  2009-06-19 14:54  杨志伟  CSDN  我要评论(0)

      本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题。一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多。

      MySQL默认编码是latin1

         1. mysql> show variables like 'character%'; 
         2. +--------------------------+--------------------------+ 
         3. | Variable_name            | Value                   
         4. +--------------------------+--------------------------+ 
         5. | character_set_client     | latin1                  
         6. | character_set_connection | latin1                  
         7. | character_set_database   | latin1                  
         8. | character_set_filesystem | binary                  
         9. | character_set_results    | latin1                  
        10. | character_set_server     | latin1                  
        11. | character_set_system     | utf8                    
        12. | character_sets_dir       | D:\MySQL\share\charsets\ | 
        13. +--------------------------+--------------------------+ 
        14. 创建数据表并插入数据 
        15. mysql> use test; 
        16. mysql> create table messages ( 
        17.     -> id int(4) unsigned auto_increment primary key, 
        18.     -> message varchar(50) not null
        19.     -> ) engine=myisam default charset=utf8; 
        20. mysql> insert into messages (message) values ("测试MySQL中文显示"); 
        21. mysql> select * from messages; 
        22. +----+-------------------+ 
        23. | id | message          
        24. +----+-------------------+ 
        25. |  1 | 测试MySQL中文显示 | 
        26. +----+-------------------+ 
        27. 编写程序(Java) 
        28. import java.sql.Connection; 
        29. import java.sql.DriverManager; 
        30. import java.sql.ResultSet; 
        31. import java.sql.Statement; 
        32. public class JDBCTest { 
        33.     public static void main(String[] args) { 
        34.         String driver = "com.mysql.jdbc.Driver"; 
        35.         String url = "jdbc:mysql://localhost:3306/test"; 
        36.         String user = "root"; 
        37.         String password = "root"; 
        38.         try { 
        39.             Class.forName(driver); 
        40.             Connection conn = DriverManager.getConnection(url, user, password); 
        41.             Statement stmt = conn.createStatement(); 
        42.             stmt.executeUpdate("insert into messages (message) values ('测试MySQL编码')"); 
        43.             ResultSet rs = stmt.executeQuery("select * from messages"); 
        44.             while (rs.next()) { 
        45.                 int id = rs.getInt("id"); 
        46.                 String message = rs.getString("message"); 
        47.                 System.out.println(id + " " + message); 
        48.            
        49.             rs.close(); 
        50.             stmt.close(); 
        51.             conn.close(); 
        52.         } catch (Exception e) { 
        53.             e.printStackTrace(); 
        54.        
        55.    
        56. } 
        57. 程序输出 
        58. 1 ????MySQL???????? 
        59. 2 ??MySQL??

      我们看到,尽管使用数据库时我们能够正常的添加和显示中文,但是在使用程序连接数据库时并不能够正常显示中文,为此我们需要修改MySQL的默认编码,编辑my.ini(MySQL配置文件)文件对编码进行修改

      设置MySQL的默认字符集为utf8,找到客户端配置[client]在下面添加。

      default-character-set=utf8

      找到服务器配置[mysqld]在下面添加

      default-character-set=utf8

      设定MySQL数据库以utf8编码运行,连接MySQL数据库时使用utf8编码

      停止和重新启动MySQL

      net stop mysql

      net start mysql

     //实际中,最新mySQL以上两句已经失效,在命令行中先exit   然后重新登录可以实现这个目的

      重新连接数据库,查看编码,数据表内容

         1. mysql> show variables like 'character%'; 
         2. +--------------------------+--------------------------+ 
         3. | Variable_name            | Value                   
         4. +--------------------------+--------------------------+ 
         5. | character_set_client     | utf8                    
         6. | character_set_connection | utf8                    
         7. | character_set_database   | utf8                    
         8. | character_set_filesystem | binary                  
         9. | character_set_results    | utf8                    
        10. | character_set_server     | utf8                    
        11. | character_set_system     | utf8                       //该行未更改,建议使用替换,这样能改的全面
        12. | character_sets_dir       | D:\MySQL\share\charsets\ | 
        13. +--------------------------+--------------------------+ 
        14. mysql> use test; 
        15. mysql> select * from messages; 
        16. +----+-------------------------------+ 
        17. | id | message                      
        18. +----+-------------------------------+ 
        19. |  1 | 虏芒脢脭MySQL脰脨脦脛脧脭脢戮            
        20. |  2 | ??MySQL??                    
        21. +----+-------------------------------+ 
        22. 这里显示依然是乱码主要是因为之前使用的编码不同造成的,重新运行之前写的程序:java JDBCTest 
        23. 1 ????MySQL???????? 
        24. 2 ??MySQL?? 
        25. 3 测试MySQL编码 
        26. 从第三条记录我们可以看到现在程序连接数据库时可以正常的添加和显示中文了 //如果从MySQL command line中仍然查询不到数据,显示数据集为空,继续完成第三步使得系统的编码和mySQL的编码一致就可以查询出来了……&
        27. mysql> select * from messages; 
        28. +----+-------------------------------+ 
        29. | id | message                      
        30. +----+-------------------------------+ 
        31. |  1 | 虏芒脢脭MySQL脰脨脦脛脧脭脢戮            
        32. |  2 | ??MySQL??                    
        33. |  3 | 娴嬭瘯MySQL缂栫爜                
        34. +----+-------------------------------+

      看回数据库的显示,我们会很奇怪的发现为什么显示的都是乱码,这主要是和windows下命令行的编码有关,在命令行上(命令提示符左上角图标处右键属性)查看属性->选项的当前代码页:936   (ANSI/OEM - 简体中文 GBK)(本人机子上是这样显示的)
      也就是说命令行上使用的是GBK编码,而我们是在程序连接时使用utf8进行添加的,所以会出现有乱码,现在我们将客户端的编码改成gb2312或gbk试一下

         1. mysql> show variables like 'character%'; 
         2. +--------------------------+--------------------------+ 
         3. | Variable_name            | Value                   
         4. +--------------------------+--------------------------+ 
         5. | character_set_client     | gb2312                  
         6. | character_set_connection | gb2312                  
         7. | character_set_database   | utf8                    
         8. | character_set_filesystem | binary                  
         9. | character_set_results    | gb2312                  
        10. | character_set_server     | utf8                    //最后你会发现这个还是没有更改,见下文
        11. | character_set_system     | utf8                    
        12. | character_sets_dir       | D:\MySQL\share\charsets\ | 
        13. +--------------------------+--------------------------+ 
        14. mysql> use test; 
        15. mysql> select * from messages; 
        16. +----+-------------------+ 
        17. | id | message          
        18. +----+-------------------+ 
        19. |  1 | ????MySQL???????? | 
        20. |  2 | ??MySQL??        
        21. |  3 | 测试MySQL编码    
        22. +----+-------------------+

      补充:更改character_set_server,在安装目录的bin文件夹下使用MySQLInstanceConfig.exe配置,在很多步骤中的一步(选择编码)选择第二项(使用UTF-8)或者第三项(自己设定)……更改完毕……

现在可以看到中文正常显示了(主要是因为utf8也支持中文),所以当我们使用命令行工具连接数据库的时候最好将客户端的编码改一下,如果使用GUI的话就不必了,同时修改客户端的编码之后程序依然能够正常显示(以上两点已经测试)

      所以如果在程序中要显示中文的话我们可以选用utf8,gb2312,gbk这三种编码,但是如果想在命令行添加中文数据或者查看的话就需要将客户端的编码设置为gb2312或gbk了,还是那句,CMD的编码有关

原文:http://hi.baidu.com/jsmlay/item/1f824518c8bf6d06e75c3637

 

注意如下:

遇到一个奇怪的mysql乱码问题,我的mysql全部已经设置成了utf-8,sql-front中文显示也是正常的,通过程序或者是FRONT都能够查找中文,就单单再mysql中是乱码。
mysql> SHOW VARIABLES LIKE 'character_set_%';   -----------------------------+
   | Variable_name            | Value                                     |
   +--------------------------+-------------------------------------------+
   | character_set_client     | utf8                                   |
   | character_set_connection |  utf8 |
   | character_set_database   utf8 |
   | character_set_filesystem | binary                                    |
   | character_set_results    utf8 |
   | character_set_server     utf8 |
   | character_set_system     | utf8                                      |
   | character_sets_dir       | C:\MySQL\MySQL Server 5.0\share\charsets\ |
   +--------------------------+-------------------------------------------+
   8 rows in set (0.06 sec)
看似都正常但是在mysql中执行select出来的中文都是乱码,sql-front正常。

声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
自己结贴,字符就算都转成了UTF8但是控制台的字符好像一定要GBK,不知道什么原因我所有字符都是UTF8的但是要想不是乱码一定要在控制台中输入set names gbk;这样就不乱了,说实话很茫然。
 

mysql命令行下:

安装时是UTF8,my.ini下也改了。可使用show variables like 'character\_set\_%';查看时,发现

character_set_database=labins,character_set_server=labins

 

查看字符集  show variables like 'character\_set\_%';

修改字符集 set character_set_client=utf8;
 

MySQL字符集修改命令 

1.修改服务器级 a. 临时更改: mysql>SET GLOBAL character_set_server=utf8; b. 永久更改:shell>vi /etc/my.cnf[mysqld]default-character-set=utf8 

2.修改数据库级 a. 临时更改: mysql>SET GLOBAL character_set_database=utf8; b. 永久更改:改了服务器级就可以了

3.修改表级 mysql>ALTER TABLE table_name DEFAULT CHARSET utf8; 更改了后永久生效 

4.修改列级修改示例: mysql>ALTER TABLE `products` CHANGE `products_model` `products_model` VARCHAR( 20 CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; 更改了后永久生效 5.更改连接字符集 a. 临时更改:mysql> SET NAMES utf8;b. 永久更改: shell>vi /etc/my.cnf[client]中增加:default-character-set=utf8 

查看和改变mysql的编码方式(转发)

Windows:

在mysql中查看编码方式show variables like 'character%';

mysql> show variables like 'character%';
+--------------------------+----------------------------------------------------
-----------+
| Variable_name            | Value
           |
+--------------------------+----------------------------------------------------
-----------+
| character_set_client     | utf8    客户端编码方式
           |
| character_set_connection | utf8    建立连接使用的编码方式
           |
| character_set_database   | utf8    数据库的编码方式
           |
| character_set_filesystem | binary
           |
| character_set_results    | utf8    结果集的编码方式
           |
| character_set_server     | utf8    数据库服务器的编码方式
           |
| character_set_system     | utf8
           |
| character_sets_dir       | D:\Program Files (x86)\MySQL\MySQL Server 5.1\share
\charsets\ |
+--------------------------+----------------------------------------------------
-----------+
8 rows in set (0.00 sec)

linux:

系统下,修改MySQL数据库默认编码的步骤为:

  • 停止MySQL的运行
    /etc/init.d/mysql start (stop) 
    为启动和停止服务器

  • MySQL主配置文件为my.cnf,一般目录为/etc/mysql

var/lib/mysql/ 放置的是数据库表文件夹,这里的mysql相当于windowsmysqldate文件夹

  • 当我们需要修改MySQL数据库的默认编码时,需要编辑my.cnf文件进行编码修改,linux下修改mysql的配置文件my.cnf,文件位置默认/etc/my.cnf文件 

    找到客户端配置[client] 在下面添加 
    default-character-set=utf8 
    默认字符集为utf8 
    在找到[mysqld] 添加 
    default-character-set=utf8 
    默认字符集为utf8 
    init_connect='SET NAMES utf8' 
    (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行) 

    修改好后,重新启动mysql 即可,重新查询数据库编码可发现编码方式的改变:

>show variables like 'character%'; 
+--------------------------+----------------------------+ 
| Variable_name | Value | 
+--------------------------+----------------------------+ 
| character_set_client | utf8 | 
| character_set_connection | utf8 | 
| character_set_database | utf8 | 
| character_set_filesystem | binary | 
| character_set_results | utf8 | 
| character_set_server | utf8 | 
| character_set_system | utf8 | 
| character_sets_dir | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

此方法用于标准mysql版本同样有效,对于/etc/my.cnf文件,需要从mysql/support-files的文件夹cp my-large.cnf一份到/etc/my.cnf


 

3windows系统下可以删除MySQL数据库,并重新安装,在安装过程中可以直接用Mysql Server Instance Config Wizard 进行设置

 


 

4、当MySQL数据库服务器已经有数据不适合删除重装时,可以个别指定数据库的编码方式。MySQL指定编码的方式是非常灵活并多样化的,可以指定表级别的编码,行级别编码,甚至可以指定字段级别的编码。

以下示例给出创建数据库时指定编码的两种方式:

1CREATE DATABASE ms_db CHARACTER SET utf8 COLLATE utf8_general_ci

2create database if not exists netctoss default character set utf8;

5、如果你采用的是外部接入的方式,可以在连接中确定请求的编码格式如:jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8(注意:不要出现任何空格,否则出错)

6、执行脚本:指定编码格式set names gbk(注意,不是UTF-8)可以修改

执行前:

 

执行后:

 

从执行命令前后可知,set names gbk只可以修改character_set_clientcharacter_set_connectioncharacter_set_results的编码方式,并且这种修改是窗口级别的,只针对本窗口有效,打开另外一个窗口修改无效。也可发现数据库底层的编码方式没有改变,插入数据后还是以utf8编码方式保持。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有