Mysql 数据库字符集转换及版本升/降级教程

最近discuz发布了新的版本,免费了,用的人更多了,以前使用其它论坛程序和discuz2.5/3.0的纷纷转换或升级到discuz4.0,可见discuz作为中国人开发的php论坛程序,确实是非常优秀的,在大家欣喜若狂的时候,也遇到了一些问题

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

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

MySQL 4.1开始把多国语言字符集分的更加详细,所以导致数据库迁移,或则dz论坛升级到4.0后(dz4.0开始使用gbk或utf-8编码)出现乱码问题。

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

查看系统的字符集和排序方式的设定可以通过下面的两条命令:

QUOTE:

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)

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

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

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

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

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

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

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

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

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

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

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

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

SET NAMES 'gbk';

其中gbk是数据库字符集。

它相当于下面的三句指令:

SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;

时间: 2024-09-28 08:03:44

Mysql 数据库字符集转换及版本升/降级教程的相关文章

Oracle数据库字符集转换规律全面剖析

作为一个Oracle数据库的用户,对于Export和Import两个命令绝对不会感到陌生,因为这二者正是我们经常用于数据备份和恢复的工具.但在使用这两个命令过程中所发生的Oracle字符集问题,常给一些Oracle使用者带来不必要的麻烦和不必要的数据损失.本文将就Export和Import过程中Oracle字符集的转换规律及使用这两个命令的注意事项做一总结. 字符集转换的原因 Export.Import过程如上图所示,从这个示意图中可以看到有四处关系到字符集,而这四处字符集的不一致恰恰是导致Or

centos6中mysql数据库字符集设置解决中文乱码问题

今天在部署一个系统时,网页出现了乱码.于是各种百度(之前一直用同一种方式,但是没影响使用), 下面做个试验. 本服务器系统是centos6.3,lamp环境全部用yum安装.没有优化过任任何配置 下面看mysql默认字符集配置 MySQL  代码如下 复制代码 mysql> show variables like "%char%"; +--------------------------+----------------------------+ | Variable_name 

MySQL数据库字符集错问题的解决

出现错误的示例: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gbk_bin,IMPLICIT) for operation '=', SQL State: HY000, Error Code: 1267 原因: 数据库的编码与建表时的编码不一样: 处理方法: 如果安装MySQL时设置的编码为jbk,那么建表时可以用下面的方法处理: CREATE TABLE `teachers` ( id` int(11) NOT NULL

liunx系统下安装mysql数据库5.7.13版本

一:在/usr/local目录下解压安装包 二:mysql的目录结构 三:添加用户组mysql,添加用户mysql,给/usr/local/mysql目录授权给mysql用户.安装mysql服务,生成第一次登陆的临时密码:sj06riLBKd,>--安装mysql的时候报错,则缺少依赖库,需要安装依赖库./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: N

MySQL数据库InnoDB索引原理详解实践教程【图】

InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇以介绍InnoDB为主,少量涉及MyISAM作为对比. 这篇文章是我在学习过程中总结完成的,内容主要来自书本和博客(参考文献会给出),过程中加入了一些自己的理解,描述不准确的地方烦请指出. 1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有太多相关文章,但是考虑到清晰的图示对理解问题有很大帮助,也为了保证文章完整性,最后还是加上了这部分. 先看看几种树形结构: 1 搜索二叉树

MySQL数据库慢日志分析工具mysqlsla使用教程

mysqlsla是hackmysql.com推出的一款mysql的日志分析工具,功能非常强大. 数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等. 一.使用 mysqlsla -lt slow mysql-slow.log 或者 mysqlsla -lt slow mysql-slow.log -sf "+SELECT" -db dbName -top 10 -sort t_sum 参数意义 lt:表示日志类型,有slow, general, binary,

MySQL数据库自动定时备份策略与恢复教程

注意:主从同步不能代替数据库备份 举例说明,如果我们在主数据库上误删了一个table,那么从数据库也会执行相应的操作,如果没有备份,这就会导致删掉的数据就无法找回.(即使回滚二进制日志也不一定能找回,因为二进制日志的保存是有时间限制的,并且回滚二进制日志非常复杂). 因此数据库的完全备份.增量备份是至关重要的. 备份策略 1. 每天进行数据库备份. mysqldump --master-data --single-transaction -R --databases [db1] [db2] [d

修改MySQL数据库字符编码为UTF-8解决中文乱码

问题: 由于MySQL编码原因会导致数据库出现乱码. 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 mysql -uroot -p #输入密码进入 status; #查看当前MySQL运行状态,如下图所示: 系统运维  www.osyunwei.com  温馨提醒:系统运维原创内容版权所有,转载请注明出处及原文链接 Server characterset: latin1 Db characte

Linux下安装管理mysql数据库

一.卸载掉原有mysql 我们通过工具SecureCRT 5.1连接到linux服务器,要用root管理员用户,如果是普通用户登录的话,可以通过su  -  root切换为root管理员用户. 我下载的Linux系统集成了mysql数据库在里面,我们可以通过命令来查看我们的操作系统上是否已经安装了mysql数据库: rpm -qa | grep mysql 有的话,我们就通过命令卸载掉: rpm -e --nodeps mysql 删除完以后我们再用 rpm -qa | grep mysql 命