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编码为例建立数据库如图:

2,用php连接数据库时用mysq_query 设定一下编码
语法: mysql_query("SET NAMES 'utf8'");
例如:
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前面不可以有任何输出,包括空格在内.
好了写了这么多,快看看你的程序属于哪个情况引起的乱码吧.
sql点滴40—mysql乱码问题总结的更多相关文章
- sql点滴42—mysql中的时间转换
原文:sql点滴42-mysql中的时间转换 UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时 ...
- sql点滴42—mysql中的数据结构
原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...
- sql点滴41—mysql常见sql语法
原文:sql点滴41-mysql常见sql语法 ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename ...
- sql点滴37—mysql中的错误Data too long for column '' at row 1
原文:sql点滴37-mysql中的错误Data too long for column '' at row 1 1.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQ ...
- sql点滴44—mysql忘记root密码
1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd1窗口,切换到mysql的bin目录,运行命令: mysq ...
- sql点滴43—mysql允许用户远程登陆
方法1 局域网连接mysql报错: ERROR 1130: Host '192.168.0.220' is not allowed to connect to this MySQL server 解 ...
- sql点滴45—mysql中group_concat用法
group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组, ...
- 10分钟学会理解和解决MySQL乱码问题
在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符集和字符编码 本博客已经迁移至: http://cenalulu.github.io/ 为了 ...
- 理解和解决MySQL乱码问题【转】
本文来自:http://www.cnblogs.com/cenalulu/p/4325693.html 要了解为什么会出现乱码,我们就先要了解从客户端发起请求,到MySQL存储数据,再到下次从表取回客 ...
随机推荐
- Canvas的方法覆盖和实现新的API
有时候为了特定需求或者特殊目的,需要覆盖或者重写某个API,在Canvas中,就需要用到CanvasRenderingContext2D这个对象. CanvasRenderingContext2D为C ...
- 播放视频的框架Vitamio的使用问题
曾经用过这个牛逼的框架,后来又任意搞了下.发现播放不了视频了.搞了老半天才搞好,今天又随便整了下,发现又不行了.我勒个插! 如今最终又搞出来了,发现我总是把步骤搞错或少写了些东西 总的步骤: 一:导入 ...
- 使用shell命令分析统计日志
用户需要登录统计信息,当分析用户行为,使用shell通常可以很容易地取出了大量的数据.删除,然后放入excel统计. 例如:统计日志含有loadCustomProcess这个地址的訪问,按訪问耗时排序 ...
- uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))
标题效果:有两个长度p+1和q+1该序列.的各种元素的每个序列不是相互同.并1~n^2之间的整数.个序列的第一个元素均为1. 求出A和B的最长公共子序列长度. 分析:本题是LCS问题,可是p*q< ...
- hdu 4965 Fast Matrix Calculation(矩阵高速幂)
题目链接.hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N. 矩阵C = A*B 矩阵M=CN∗N 将矩阵M中的全部元素取模6,得到 ...
- LeetCode :: Insertion Sort List [具体分析]
Sort a linked list using insertion sort. 仍然是一个很简洁的题目,让我们用插入排序给链表排序:这里说到插入排序.能够来回想一下, 最主要的入门排序算法.就是插入 ...
- Play Framework + ReactiveMongo
Play Framework + ReactiveMongo Play!是一个full-stack(全栈的)Java/Scala Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate ...
- InstallShield安装包中集成第三方安装包的方案选择
原文:InstallShield安装包中集成第三方安装包的方案选择[转] 我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的 ...
- swift UI特殊培训38 与滚动码ScrollView
有时我们适合页面的全部内容,我们需要使用ScrollView,额外的内容打通滚动. 什么样的宽度和高度首先,定义,健身器材轻松. let pageWidth = 320 let pageHeight ...
- Java批处理操作
批量,可以大大提高众多增加.删除.变化的步伐,它是有一个非常大的数据处理效率大收益. 的"连接池"相似.事实上就是先将多次操作(增删改)打包.然后再一次发送运行 主要用到两个方法: ...