前言:
本人一直以来被MYSQL 数据库乱码问题所困扰--- 生气ING
今天特意做一个prototype,从零开始创建一个DB 。
并练习使用mysqldump导出sql文件作为备份,导入sql文件恢复数据库 。
概述:
为了避免MYSQL 中文乱码的情况发生,我们需要注意以下几点:
1 建立数据库时候指定编码方式为utf8
mysql> create database test character set utf8 ;
2 建立表结构的时候需要指定编码方式 为utf8
CREATE TABLE `homes` (
xxxxxxx
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;
3 备份数据库时需要指定编码方式 latin1
#mysqldump -u root -proot -F --default-character-set=latin1 test> /var/lib/mysql/doc/homes_2012_11_08.sql
4 恢复数据库时候(单纯恢复表结构表数据,数据库并未删除) 不需要指定数据库编码方式
# mysql -uroot -proot test < /var/lib/mysql/doc/homes_2012_11_08.sql
步骤
第一步 创建数据库
1 登录MYSQL -- >太简单了 命令行省略掉
2 创建一个新的DB --> 注意哦 数据库的字符编码方式我设置成为 utf8
mysql> create database test character set utf8 ;
3 下面来验证一下 ---> 查询结果DB的字符编码方式确实是utf8
mysql> use information_schema
mysql> select * from SCHEMATA where SCHEMA_NAME='test ';
+--------------+-------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+-------------+----------------------------+------------------------+----------+
| NULL | test | utf8 | utf8_general_ci | NULL |
+--------------+-------------+----------------------------+------------------------+----------+
1 row in set (0.00 sec)
4 创建一张表
[root@localhost share]# mkdir /var/lib/mysql/ doc
--->在mysql存放数据的文档下面创建doc文件夹 专门存放.sql 文件
[root@localhost share]# touch /var/lib/mysql/doc/homes.sql
[root@localhost share]# vi /var/lib/mysql/doc/homes.sql --->编辑.sql文件 包含生成创建SQL语句的信息
DROP TABLE IF EXISTS `homes`; CREATE TABLE `homes` ( `id` bigint(33) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; insert into homes values('','永外民主东街'); insert into homes values('','紫竹桥南'); insert into homes values('','三元桥'); insert into homes values('','将府家园');
[root@localhost mysql]# mysql -uroot -proot -e "source /var/lib/mysql/doc/homes.sql" test
------>不进入MYSQL数据执行.sql建表语句命令
第二步 导出数据库内容到指定文件 ------>备份数据库操作
#mysqldump -u root -proot -F --default-character-set=latin1 test> /var/lib/mysql/doc/homes_2012_11_08.sql
--->指定字符编码为 latin1
指定备份的数据库为test
-F表示新生成一个日志文件
查看这个导出的sql文件 内容如下
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `homes` -- DROP TABLE IF EXISTS `homes`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `homes` ( `id` bigint(33) NOT NULL AUTO_INCREMENT, `name` varchar(60) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `homes` -- LOCK TABLES `homes` WRITE; /*!40000 ALTER TABLE `homes` DISABLE KEYS */; INSERT INTO `homes` VALUES (1,'永外民主东街'),(2,'紫竹桥南'),(3,'三元桥'),(4,'将府家园'); /*!40000 ALTER TABLE `homes` ENABLE KEYS */; UNLOCK TABLES;
查看新生成的二进制日志文件
#mysqlbinlog /var/lib/mysql/doc/bing.000015
/*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; mysqlbinlog: File 'bing.000015' not found (Errcode: 2) DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
第三步 导入SQL 文件到数据库 -->还原操作
1 模仿数据库崩溃操作 删除数据库新创建的表 -- homes
2 执行以下命令恢复数据库
[root@localhost doc]# mysql -uroot -proot test < /var/lib/mysql/doc/homes_2012_11_08.sql
或者
进入MYSQL后执行以下命令
mysql>use test;
mysql>set character set latin1; --->设置编码方式 保证数据库不是乱码 可省略
mysql>source /var/lib/mysql/doc/homes_2012_11_08.sql;
3 查询 -- 成功
mysql> select * from homes; +----+--------------------+ | id | name | +----+--------------------+ | 1 | 永外民主东街 | | 2 | 紫竹桥南 | | 3 | 三元桥 | | 4 | 将府家园 | +----+--------------------+
知识补充
MYSQL 允许定义任何级别的字符集和校对规则,在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串。
==========================MYSQL 字符集的参考资料============================
http://www.oklinux.cn/html/sql/mysql/20090227/67808_2.html
======================================================================