sql点滴40—mysql乱码问题总结

时间:2023-09-16 17:20:48

原文:sql点滴40—mysql乱码问题总结

本文将为大家讲解如何处理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的编码有关

迷茫啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

1.查询编码

show variables like 'character%';

2.设置数据库字符集

alter database moviesite character set utf8

3.设置表的字符集

alter table movie convert to character set utf8

4.不知道

set character_set_results=utf8

5.不知道

set character set utf8

6.不知道

set names 'utf8'

有时候这些都不管用,要设置成gbk或gb2312,好像没什么规律,我擦!。

php网页出现乱码一般是在建立数据库时用的编码和php网页的编码不同造成的, 

用phpmyadmin建立的数据库如果你不指定编码他默认是latin1_swedish_ci 编码,既瑞典语不区分大小写,而我们中国做的网页不是GBK就是GB2312编码,这样不出现乱码才怪. 

1,建立数据库时指定编码. 

在此再唠叨一下常用的编码,免的新手又迷茫: 
如果你做的是简体中文网页,那么你在建立数据库时用GB2312编码,gb2312_chinese_ci. 
如果你做的是繁体中文网页,那么你建立数据库时要用gib5编码, big5_chinese_ci 
如果你做的网页有简体也有繁体中文,那么推荐你用GBK编码,gbk_chinese_ci . GBK包含的字码比GB2312要多,当然繁体也在其中. 
如果你做的是多国语言网页,那么推荐你用UTF-8编码 . mysql中有二种utf8编码可供选择 : utf8_unicode_ci与utf8_general_ci 笔者一般用utf8_general_ci ,关于这二种编码的区别,请参考本站的另一篇文章: Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别 
我们用UTF-8编码为例建立数据库如图:

sql点滴40—mysql乱码问题总结

2,用php连接数据库时用mysq_query 设定一下编码 
语法: mysql_query("SET NAMES 'utf8'"); 
例如:

复制代码代码如下:
$conn=mysql_connect('127.0.0.1','root','123456'); 
mysql_query("set names 'utf8'",$conn); //解决乱码 
mysql_select_db('test1',$conn); 

一般情况下只要你做好了这二步,你的程序是不会出现乱码的 
二般情况: 
二般情况一般出现的不多,多出现在做的程序语言比较多,比如有时做utf8的,有时做gb2312的,有时又要做big5的网页,用IDE建立的.php文件编码和程序要显示的编码不同而引起的. 
比如,我上次做了个gb2312的简体中文网页,现在老板又有吩咐要做个gbi5网页,但我的ide用的却是gb2312的编码 
就拿我常用的IDE Dreamweaver来说吧

sql点滴40—mysql乱码问题总结

ide新建的网页是gb2312,而我却把建好的网页改成big5的了,这样怎么会不出现乱码呢,解决的方法很简单,重新另存为一下,指定一下编码就OK了, 
如果还搞不定,那么在网页头部加一行http头信息 
header("Content-Type:text/html;charset=utf-8"); 
注意:在发送header头信息时header前面不可以有任何输出,包括空格在内. 
好了写了这么多,快看看你的程序属于哪个情况引起的乱码吧.