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

原文: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‘"); 
例如:

复制代码代码如下:

$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前面不可以有任何输出,包括空格在内. 
好了写了这么多,快看看你的程序属于哪个情况引起的乱码吧.

时间: 2024-11-03 03:24:27

sql点滴40—mysql乱码问题总结的相关文章

sql点滴42—mysql中的数据结构

MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补. 表列出了各种数值类型以及它们的允许范围和占用的内存空间. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0,65 535)

sql点滴42—mysql中的时间转换

UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Select UNIX_TIMESTAMP(’2006-11-04 12:23:00′); 例:mysql查询当天的记录数: $sql=”select * from message Where DATE_FORMAT(FROM_UNIXTIME(chattime),’%Y-%m-%d’) = DA

sql点滴37—mysql中的错误Data too long for column '' at row 1

原文:sql点滴37-mysql中的错误Data too long for column '' at row 1   1.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止.重启动) 2.命令行方式 Windows 1.点击“开始”->“运行”(快捷键Win+R). 2.启动:输入 net stop mysql 3.停止:输入 net start mysql 提示* Redhat Linux 也支持service command,启动:# servic

sql点滴41—mysql常见sql语法

原文:sql点滴41-mysql常见sql语法 ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 添加带注释的列:alter table directory add index_url varchar(256) default null comment '章节书目链接' after di

sql点滴43—mysql中的时间转换

局域网连接mysql报错: ERROR 1130: Host '192.168.0.220' is not allowed to connect to this MySQL server 解决方法: 可能是帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"

MySQL命令行导入sql文件时出现乱码解决方案

Note: sql> source F:weibo.sql(执行相关sql文件) sql> select * from sina into outfile "/weibo.txt"(导出相应数据到C:的weibo.txt) 1. mysql 5.0后其客户端仅支持gbk,故可在sql> set names gbk; 例如: set names gbk; /* Navicat MySQL Data Transfer Source Server : localhost_3

10分钟学会理解和解决MySQL乱码问题

本文将详细介绍MySQL乱码的成因和具体的解决方案 MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为.为了更好的解释这个过程,博主制作了两张流程图,分别对应存入和取出两个阶段. 存入MySQL经历的编码转换过程 上图中有3次编码/解码的过程(红色箭头).三个红色箭头分别对应:客户端编码,MySQL Server解码,Client编码向表编码的转换.其中Terminal可以是一个B

mysql 乱码解决方案

如何解决MYSQL数据中文乱码问题? 第一种方法,总结: 经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧: WINDOWS 下导入应该这样使用MYSQL的命令在DOS命令下进入mysql的bin目录下,输入mysql -uroot -p密码 数据库名称<要恢复的数据库, 例如我们要把D盘的一个名称为test.sql的数据库恢复到本地的test2这个数据库,那么就这样: mysql -uroot -p密码 te

sql点滴41—MyISAM 和 InnoDB 讲解

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能. 以下是一些细节和具体实现的差别: 1.InnoDB不支持FULLTEXT类型的索引. 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(