转发一篇解决乱码的办法,非常实用。

mysql转换或者升级以后出现乱码情况的说明

发布时间: 2005-12-12 15:06 作者: ramboo 信息来源: supesite/x-space

看到不少用户反映转换完以后是乱码的情况,出现这种现象的主要原因是这类用户使用的都是mysql4.1以上的版本.下面作一个说明,希望出现这个问题的朋友都能耐心的把这个文档看完!!!

原理

注意:本文档只对mysql 4.1及以上的数据库版本有效,之前的mysql版本,由于没有提供对字符集的完整支持,因此也不存在此类问题。

mysql 4.1开始,对多语言的支持有了很大变化 (这导致了问题的出现)。尽管大部分的地方 (包括个人使用和主机提供商),mysql 3、4.0 仍然占主导地位;但 mysql 4.1 是 mysql 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多;因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 php 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题。

mysql 4.1 对于字符集的指定可以细化到一台机器上安装的 mysql,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

编译 mysql 时,指定了一个默认的字符集,这个字符集是 latin1;

安装 mysql 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;

启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;

此时 character_set_server 被设定为这个默认的字符集;

当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;

当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;

在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;

当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;

想要进行“正确”的存储和得到“正确”的结果,最方便的是在所有query开始之前执行一下:

set names 'gbk';

其中gbk是数据库字符集。

常见问题解决方案

我的数据使用latin1或其他编码存储中文信息,但phpmyadmin中中文为乱码

这问题是由于新版本的phpmyadmin都是强制使用正确的字符集进行数据库连接和显示的,因此如果存储内码和实际内码不一致,phpmyadmin是无法识别的。对于简体中文,phpmyadmin可识别gbk/utf8;繁体中文,可识别big5/utf8。如果你确定想使用这种“不正确”的字符集(事实上通常在mysql 4.1之前大家都是用“不正确”的字符集存储数据的)存储中文论坛数据,那么请使用phpmyadmin 2.5.x的老版本,他会使用最老和最普通的方式连接数据库,这样便可以正常管理。

我的论坛原来使用discuz! 4.0.0 rc版本+mysql 4.1没有问题,但升级到正式版后就有了乱码

浏览这问题前请您先看一下上一个问题的解答,您的情况和上面的情况差不多。rc版本使用“最老和最普通的方式”连接数据库,因此你如果使用“不正确”的字符集存储,事实上是没有问题的,但discuz! 4.0.0正式版使用了与phpmyadmin新版本相同的“正确”的数据库字符集,因此导致原来“不正确”的存储和“正确”的连接产生冲突,进而发生乱码。

解决此类问题,有如下两种方案:

更改存储字符集

主要的思想就是把数据库的字符集有latin1改为gbk,big5,或者utf8; 以下操作必须拥有主机权限。假设当前操作的数据库名为:database

导出

首先需要把数据导为mysql4.0的格式,具体的命令如下: mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse > test.sql

--default-characte-set 以前数据库的字符集,这个一般情况下都是latin1的,

--set-charset 导出的数据的字符集,这个可以设置为gbk,utf8,或者big5

导入

首先使用下面语句新建一个gbk字符集的数据库(test)

create database `test` default character set gbk collate gbk_chinese_ci;

然后把刚才导出的数据导入到当前的数据库中就ok了。

mysql -uroot -p --default-character-set=gbk -f test

通过以上的导出和导入就把数据库的字符集改为正确的存储方式了。

总结:这种方案比较麻烦,但相对以后则一直都是使用mysql“正确”的方式进行存储和数据连接,并且新版本phpmyadmin不会乱码。

更改连接方式

discuz! 4.0.0

对于discuz! 4.0.0正式版,您可以找到./include/db_mysql.class.php,将

mysql_query("set names '".str_replace('-', '', $globals['charset'])."'");

前面加上“//”,即将其注释掉

discuz! 4.0.0+

对于discuz! 4.0.0以后的版本,已经支持在config.inc.php中使用单独的$dbcharset来设定数据库字符集,因此可根据您的实际情况选择留空(与$charset的设置相同),或指定为特定的数据库字符集(如latin1)

总结:折衷方案。数据使用“不正确”的内码存储,但显示和使用能够正常,phpmyadmin新版本乱码,老版本可用。备份和恢复时候需要特别注意字符集问题。

应当如何升级mysql 4.0的数据到mysql 4.1+中

如果数据文件中有中文信息,那么将mysql 4.0的数据文件,直接拷贝到mysql 4.1中就是不可以的,即便在my.ini中设置了default-character-set为正确的字符集。虽然貌似没有问题,但mysql 4.1的字符集有一处非常恼人的地方,以gbk为例,原本mysql 4.0数据中varchar,char等长度都会变为原来的一半,这样存储中文容量不变,而英文的存储容量就少了一半。这是直接拷贝数据文件带来的最大问题。

所以,升级的根本,如果想使用“正确”的字符集,还是先用mysqldump导出成文件,然后导入。

至于如果原来用的latin1,现在在mysql 4.1中还想继续“错误的”使用latin1,那么只需把default-character-set设置为latin1,并且在论坛中更改连接方式即可,这样的情况是可以直接拷贝数据文件的。

mysql升级后乱码_Mysql转换或者升级以后出现乱码情况的说明相关推荐

  1. mysql 去重后拼接_mysql学习笔记(三)—— 查询select

    本节主要介绍查询语句(select),包括基础查询.条件查询.模糊查询,以及一些常用函数包括:去重函数distinct.字符拼接函数concat.null判断函数ifnull. 内容都是自己学习后从S ...

  2. 苹果6s升级后显示无服务器,iphone6s升级失败变砖的解决方法【图文】

    自从ios10正式版推送出来后,有着苹果手机的小伙伴就在考虑要不要升级系统.这不,有的朋友就把iphone6s升级ios10正式版,但是给升级失败,不知道如何解决?今天,小编就给大家带来 iPhone ...

  3. mysql插入数据时中文乱码_MySQL 插入数据时,中文乱码???问题的解决

    在终端,mysql -u root -p 登录: show variables like 'character%'; 来查看当前数据库的相关编码集. client 为客户端使用的字符集. connec ...

  4. mysql阿里云不显示中文乱码_MySQL命令窗口下中文显示乱码的解决过程

    MySQL命令窗口下中文显示乱码的解决过程 在dos客户端输出窗口中查询表中的数据,还有项目部署到服务器上时前台的页面,中文数据都显示成乱码,如下图所示: 这个问题困扰了我一天,后来解决了才发现原来我 ...

  5. 鸿蒙升级后能恢复安卓吗,升级了鸿蒙系统怎么卸载鸿蒙系统?升级了鸿蒙还能用安卓吗?...

    华为鸿蒙2.0大家都报名升级更新了吗?全新的升级,给用户带来的体验感也是不错的,不过也有不少的小伙伴觉得这个系统的缺点还是不少的,那么升级了怎么卸载?还能用回安卓的系统吗?下面就和小编一起来看看. 升 ...

  6. mysql启动后密码_mysql的初级问题-启动后无法正常登陆修改密码

    查看mysql的运行状态---正常 查看端口号3306---正常 登陆提示Can't connect to local MySQL server through socket '/tmp/mysql. ...

  7. mysql重启后自动关闭_mysql服务自动关闭的解决

    笔记本上设置成合上板子不休眠,于是干脆把笔记本放在书包里面,通过远程桌面连接笔记本电脑,经过了很长的时间,再去连接数据库,结果出现cann't connect 10061错误,发现原来是MySQL服务 ...

  8. mysql安装后密码_MySQL安装后默认密码的问题

    今天重装了mysql,发现安装好了之后,root用户自带了一个随机密码,记录一下这个坑. 1.安装mysql,然后mysql目录加到系统环境变量 2.到mysql安装目录下,和bin同一个目录,创建目 ...

  9. mysql json 中日期_mysql 转换json 时间问题

    "Unable to convert MySQL date/time value to System.DateTime"这是因为在日期列中有"0000-00-00&quo ...

最新文章

  1. 微服务系列(五):事件驱动的数据管理
  2. iOS开发工具——网络封包分析工具Charles
  3. win32下多线程同步方式之临界区,互斥量,事件对象,信号量
  4. 拖延不是你的锅,全是基因惹的祸
  5. 分布式事务科普(初识篇)
  6. android启动其他app的服务器,Android中通过外部程序启动App的三种方法
  7. magento 首页添加最新产品 Display new products on the home page
  8. efficientnet-yolo3-tf2的实现
  9. Redis详解(五)——Redis多实例
  10. 一分钟实现扫描二维码功能
  11. C#使用AForge连接摄像头并且拍照
  12. 毕设-基于JavaWeb体育竞赛管理系统
  13. 如何鉴别硬盘是否是全新的,及HD Tune的使用方法
  14. 普通IO口模拟实现SPI通信及应用解析
  15. 网易云音乐(纯CSS实战)
  16. Whois 信息与个人隐私
  17. 计算机综合应用技能,系统测评计算机综合应用技能期末作业.doc
  18. Squid缓存服务器和代理介绍
  19. HDI(高密度互联)PCB板
  20. 使用Pytorch框架自己制作做数据集进行图像分类(一)

热门文章

  1. Win环境安装VMware Server 2.0手记
  2. 转: ADO Connection Strings
  3. 多个服务间多个自定义的ExceptionHandler类的执行顺序
  4. OJ1038: 绝对值最大
  5. php 中curd表达啥,thinkphp的CURD和查询方式介绍
  6. 信息学奥赛一本通(1315:【例4.5】集合的划分)
  7. 图论 —— 环与块 —— 连通块的计数
  8. 数列分段(信息学奥赛一本通-T1428)
  9. 序列中最大的数(51Nod-1062)
  10. 图论 —— 生成树 —— 最小生成树 —— Prim