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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题。一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多。 MySQL默认编码是latin1 1. mysql> show variables like 'character%'; 2.

本文将为大家讲解如何处理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编码为例建立数据库如图: 

 

 

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来说吧 

 

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

作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com  联系我,非常感谢。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
11天前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
37 1
|
20天前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
43 1
|
12天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
29 0
|
13天前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
9 0
|
21天前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
58 0
|
11月前
|
SQL 存储 关系型数据库
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
146 0
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉2
MySQl数据库第八课-------SQL命令查询-------主要命脉
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉 1
MySQl数据库第八课-------SQL命令查询-------主要命脉
112 0
|
SQL 存储 开发框架
MySQl数据库第六课-------SQl命令的延续------快来看看
MySQl数据库第六课-------SQl命令的延续------快来看看
|
SQL 存储 NoSQL
MySQl数据库第五课 --------在SQl的简单命令--------学习学习
MySQl数据库第五课 --------在SQl的简单命令--------学习学习