再谈MySQL升级出现乱码问题的解决

转载 2007年10月16日 00:56:00
原贴:http://www.wujianrong.com/archives/2007/05/mysql_10.html

以前写过一篇关于MySQL升级到4.1出现乱码如何解决的帖子,他只是讲述了当你导入的数据都正常了,该怎么使用到MySQL4.1以后版本的多 语言特征。但是如果在导入的过程中就遇到了字符集的问题,该怎么办呢?就是无论你怎么导入,怎么折腾字符集,都是乱码,但是你新插入的任何一条数据都没有 问题,这就不是升级后调整字符集的问题了,而是在导出导入的工程中就需要考虑。

UP这两天估计被这个问题折腾的够呛,虽然事后找到的原因不是在于数据库,但是这里还是把升级的过程记录下来。今天up问我上次论坛如何升级和转换的,我就记得不太清楚了。

我自己试验成功的有两种方式
1)只需要把你原来版本的数据库文件考到到新的数据库目录下,什么都不用修改,这个时候输出应该是正常的,默认采用了latin1字符集。这大概只最简单的方式了,不过这种方式不太好的地方在于一旦将来要转换字符集,很是麻烦。

2)假设你要从MySQL4.0以下版本升级到MySQL4.1以上版本,并明确指定需要的字符集是gb2312,那么我的步骤是
a)在原来的数据库上导出你要的数据库,可以使用下面的命令:

$mysqldump -u username -p password databasename >xxx.sql
b)修改导出的sql文件,首先将导出的数据表加上默认字符集gb2312,可以在vi中只用下面的替换命令

% s/engine=MyISAM;/engine=MyISAM DEFAULT CHARSET=GB2312;/g
当然你可以使用你喜欢的编辑器来替换;其次是将这个sql文件转化成gb2312编码格式的文件。你可以先file看看该文件的字符集,如果是ISO8859的,那还不错,如果是Non-ISO格式,那就必须转换,可以使用下面的命令

iconv -c -t gb2312 -o outout.sql xxx.sql
UP导出的数据就是Non-ISO格式。

c)连接新的数据库服务器,创建需要的数据库

CODE:
[Copy to clipboard]
mysqladmin -uroot -p create databasename
d)在导入数据之前,看看默认的字符集,可以使用下面的方法

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
默认的字符集都是latinn1的,这个时候,你需要将latin1转换成gb2312,方法如下

mysql> set NAMES 'utf8';
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_server=utf8;
Query OK, 0 rows affected (0.00 sec)
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/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)
这时数据库字符集已经修改,可以导入数据了

mysql>source /path/to/xxx.sql
然后在你的网页中,在连接数据后,加上下面的一条指令

mysql_query(”set NAMES 'utf8'");
应该就可以了,当然你的网页编码本身应该也要式gb2312的。

那么UP为什么会要折腾两天呢?不是他的步骤和方法有问题,而是操作系统的问题!操作系统?ubuntu!
问 题就出现在iconv转换的过程中,只要转换成GB2312,那些中文就成了空白,而同样的文件,在其他Linux操作系统上就不会出现这个问题,难道式 ubuntu并不支持GB2312?还是别的原因,个人没有使用过ubuntu,不太清楚他的字符集和字体支持是如何的,不过想来我用过的 redhat,fedora,suse确实都在字符集和中文字体方面有些欠缺。这个方面,红旗Linux显然要优秀一些。

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。

我 使用phpmyadmin来操作mysql,使用了zh- cn-utf8的连接方式,数据库和表也使用了utf8的编码,在phpmyadmin里数据都很正常,但是使用php连接并打印出来以后成为??,既不 是utf8,也不是gb2312,更不是iso8859,如果从我的表单插入数据,则显示乱码,有些是中文,有些是乱码。查看了一下mysql 4.1手册中有关字符集的问题,问题解决,总结如下:

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

查看系统的字符集和排序方式的设定可以通过下面的两条命令:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

上面列出的值就是系统的默认值。(很奇怪系统怎么默认是latin1的瑞典语排序方式)...

当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES 'utf8';它相当于下面的三句指令:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

再试试看,正常了吧?^_^ Enjoy!

 

彻底解决mysql中文乱码的办法

原文链接:http://www.pc6.com/infoview/Article_63586.html MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例...
  • x775229836
  • x775229836
  • 2016年07月05日 15:18
  • 12584

解决mySql中文乱码以及Eclipse插入中文出现乱码

cmd --->命令行 mySql查询数据库出现中文乱码:   1、登录数据库,mysql -u root -p  ,输入密码,登入 2、查询mysql编码 : show variables...
  • ye1714505125
  • ye1714505125
  • 2016年04月15日 11:35
  • 568

MySQL 绿色版 乱码解决方法

mySQL的编码格式(关键一步)这一步我也是在度娘上找的, 首先在mySQL根目录中,把my-default.ini拷贝一份在根目录下,取名为my.ini,在my.ini中设置如下几步: 第一步:...
  • a_lonely_dancer
  • a_lonely_dancer
  • 2016年10月15日 12:43
  • 443

解决linux环境mysql中文乱码问题

操作环境: ubuntu 14.04  Mysql 5.5.43 一. 问题描述 登录后查看mysql默认编码:  mysql> show variables like 'ch...
  • Mark_LQ
  • Mark_LQ
  • 2015年07月31日 18:43
  • 1063

如何解决MySQL字符集乱码问题

MySQL自4.1版本推出之后由于中文的特殊性带来的乱码问题也随在互联网行业出现。主要原因就是不同字符集编码不同而产生的。本文简要介绍字符集相关知识及部分乱码情况的解决方式。...
  • u014743697
  • u014743697
  • 2016年12月12日 09:55
  • 1087

mysql数据库中数据表出现乱码解决办法

最近发现,在MySQL的dos客户端输出窗口中查询表中的数据时,表中的中文数据都显示成乱码,如下图所示:      上网查了一下原因:之所以会显示乱码,就是因为MySQL客户端输出窗口显示...
  • pangqiandou
  • pangqiandou
  • 2016年10月29日 12:37
  • 949

关于后端存储到mysql中的乱码问题

基本的解决乱码的流程,主要介绍的是后端到数据库之间的存储
  • tudou201601
  • tudou201601
  • 2016年10月23日 15:57
  • 256

Linux下MySQL出现乱码的解决方法以及如何设置编码方式

开发环境Cent OS 7.0; MySQL:Server version: 5.6.33 MySQL Community Server (GPL)最新版:Server version: 5.7.1...
  • u010870518
  • u010870518
  • 2016年10月10日 21:44
  • 7922

彻底解决mysql中文乱码

mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。...
  • u012410733
  • u012410733
  • 2017年03月12日 16:19
  • 13043

在CMD中操作mysql数据库出现中文乱码解决方案

百度了一下。。有说将cmd字符编码用chcp命令改为65001(utf8字符编码),可这样之后根本无法输入中文,查询出的中问结果依旧乱码 其实,只要保证cmd客户端和MySQL两者编码一致即可。 ...
  • JQ_AK47
  • JQ_AK47
  • 2017年02月16日 17:06
  • 3938
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再谈MySQL升级出现乱码问题的解决
举报原因:
原因补充:

(最多只允许输入30个字)