mysql的sql语句备份恢复
广告投放★自助友情CMS落伍广告联盟晒乐广告联盟脉动广告联盟品味广告联盟
广告位可自定样式联系QQ:4285248个文字广告月20元广告联系QQ:428524广告位可自定样式
8个文字广告月20元黄金广告位每月20元广告位可自定样式联系QQ:428524广告位可自定样式
左旋肉碱、全国包邮
买二送一、无效退款

文章浏览→编程相关Mysql→mysql的sql语句备份恢复

mysql的sql语句备份恢复
mysql的sql语句备份恢复

在mysql下显示乱码

1.用show variable like ‘character_set_%’看数据库的字符集。

2.set names gb2312|utf8等设置字符集。

 

 

sql语句备份:

1.select * into outfile ‘d:\\mysql\\table.sql' fromtableName;

2.load data infile  'd:\\mysql\\table.sql'replace into table character set utf8;

恢复时,要看文件存储的格式是什么,最后用character set utf8指定。

 

以下为网络搜索

/////////////////////////////////////////////////////////////////////////

系统配置linux
mysql 默认utf8
首先使用show  variables  like   "%char%";
+--------------------------+-------------
|Variable_name           |Value      
+--------------------------+-------------
|character_set_client    |gbk        
| character_set_connection |gbk        
| character_set_database   |utf8       
| character_set_filesystem |binary     
|character_set_results   |gbk        
|character_set_server    |utf8       
|character_set_system    |utf8       

此时可以使用set names utf8;

再次使用show  variables  like   "%char%";

+--------------------------+------------
|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      


各种字符参数统一为utf8时.
使用
mysql -uroot -p -Ne "set names utf8;select * from t_kernel wheremootime<'2008-10-01 00:00:00'" league>kernel.log

来导出数据.
导出完成后,
使用
load data infile '/home/mysql/kernel.log' into tablet_kernel;
导入数据.
这次导入的数据应该正确.

当时显示可能还是乱码.你可以通过设置set names gbk;来查看记录.是否正常.

////////////////////////////////////////////////////////////////////

mysql字符集最终解决

装confluence,使用mysql乱码,查出是mysql编码设置问题:

最终解决方案:
mysql UTF8设置:

vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8  (数据库缺省以utf8存储)
init_connect='SET NAMES utf8'(设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)

[client]
default-character-set=utf8 (客户端缺省以utf8存储)

重启mysql

登陆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/ |
+--------------------------+----------------------------+

///////////////////////////////////////////////////////////////////////////////

阅读过不少关于mysql的编码设置和乱码问题的一些文章,经过再三的调试,终于通过,终于解决了一块心病,终于解了我心头之恨,哈哈哈。现在把它概括如下。

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Characterset)和排序方式(Collation)。对于字符集的支持细化到四个层次:服务器(server),数据库(database),数据表(table)和连接(connection)。我们最终的目标是使得这四个层次转化会支持中文的编码,下面以utf8为例。
1.首先查看系统的字符集和排序方式。如果想查看某个特定的数据库的字符集和排序方式,应该先选定数据库,mysql>usedatabasename;
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)
上面列出的值就是系统的默认值,lanti是不支持中文的,所以我们把它改成urf8。

下面我们就来修改这四个层次的编码方式:
1 在my.cf文件的[mysqld]段设置:
default-character-set=utf8
这条语句的作用是把character_set_client,character_set_connection_,character_set_results设定为utf8,包括对应的排列方式的编码。
Character_set_server是系统编码,这个是不用改的。

当然改变character_set_client,character_set_connection_,character_set_results编码方式的另外一种方法是:SETNAMES “UTF8”;
它的作用相当于:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
2. 改变数据库的编码方式
alter database databasename character set utf8;

通过以上的更改数据库的编码工作算是昨晚了,当然除了这个方法还有一个万能个的方法,那就是看着那个不是utf8,你只要把相应的编码改成utf8就可以了。格式如下:SETcharacter_set_client = utf8;

3.不管你是web编程还是桌面编程,你的数据库的连接地址url中,一定要后缀:?useUnicode=true&characterEncoding=utf-8/hibernate?useUnicode=true&characterEncoding=utf-8


当然如果你采用了mysql的管理工具如mysql yog,mysqlmanager那么你数据库设定也可以在可视化环境下直接设置。当然这也只是限制在database的设定

/////////////////////////////////////////////////////////////////////////////////////////

mysql> select * from table into outfile'c:\table.txt' where 条件
(或selet * into outfile from table where 条件 )

导出来的数据会出现中文乱码情况。同时使用
mysql>load data local infile 'c:\\table.txt' intotable `table`

插入的数据也会出现乱码情况。

究其原因,这是mysql服务器系统变量中的character_set_database中默认的字符集问题

常见 mysql5.1中文手册 13.2.5. LOAD DATA INFILE语法

……
由character_set_database系统变量指示的字符集被用于解释文件中的信息。SET NAMES

和character_set_client的设置不会影响对输入的解释。

……

我的解决方法:


首先在windows平台下mysql用作源导出数据库


mysql> show variables like '%char%';
   
+--------------------------+----------------------------+
|Variable_name           |Value                     |
+--------------------------+----------------------------+
|character_set_client    |latin1                    |
| character_set_connection |latin1                    |
| character_set_database   |latin1                    |
| character_set_filesystem |binary                    |
|character_set_results   |latin1                    |
|character_set_server    |gbk                       |
|character_set_system    |utf8                      |
|character_sets_dir      | D:\mysql\share\charsets\ |
+--------------------------+----------------------------+
查看character_set_database,这里是latin1,latin1是装不了大字符集的

mysql>set character_set_database=utf8;##设置默认的字符集为utf8

mysql> select * from table into outfile'c:\table.txt' where 条件


在freebsd平台下


mysql> show variables like '%char%';
   
+--------------------------+----------------------------+
|Variable_name           |Value                     |
+--------------------------+----------------------------+
|character_set_client    |latin1                    |
| character_set_connection |latin1                    |
| character_set_database   |latin1                    |
| character_set_filesystem |binary                    |
|character_set_results   |latin1                    |
|character_set_server    |gbk                       |
|character_set_system    |utf8                      |
|
+--------------------------+----------------------------+

同样显示latin1


mysql>set character_set_database=utf8;##设置默认的字符集为utf8

mysql>load data local infile '/home/table.txt'into table `table`;


显示查看即可!

这里最好在两台服务器的character_set_database参数相同,当然我们还可以使用gbk等字符集来进行调整,看情况

////////////////////////////////////////////////////////////////////////////////////////

我来举两个例子说明一下。
一、关于编码
我们的示例文本文件:
"我爱你","20","相貌平常,经常耍流氓!哈哈"
"李奎","21","相貌平常,经常耍流氓!哈哈"
"王二米","20","相貌平常,经常耍流氓!哈哈"
"老三","24","很强"
"老四","34","XXXXX"
"老五","52","***%*¥*¥*¥*¥"
"小猫","45","中间省略。。。"
"小狗","12","就会叫"
"小妹","21","PP的很"
"小坏蛋","52","表里不一"
"上帝他爷","96","非常英俊"
"MM来了","10","。。。"
"歌颂党","20","社会主义好"
"人民好","20","的确是好"
"老高","10","学习很好"
"斜三","60","眼睛斜了"
"中华之子","100","威武的不行了"
"大米","63","我爱吃"
"苹果","15","好吃"
我们的示例表结构:


+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | CreateTable                                                                                                                                                                                                                                                         |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|t0    | CREATETABLE `t0` (
  `id`bigint(20) unsigned NOT NULL auto_increment,
  `name`char(20) NOT NULL,
  `age`tinyint(3) unsigned NOT NULL,
  `description`text NOT NULL,
  PRIMARYKEY  (`id`),
  UNIQUE KEY`idx_name` (`name`)
) ENGINE=MyISAM DEFAULTCHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00sec)


我们把这个文本文件从WINDOWS 下COPY到LINUX下看看


mysql> load datainfile '/tmp/t0.txt' ignore into table t0 character set gbk fieldsterminated by ',' enclosed by '"' lines terminated by '\n'(`name`,`age`,`description`);
Query OK, 19 rows affected (0.01 sec)
Records: 19  Deleted: 0  Skipped:0  Warnings: 0

mysql> select *from t0;
19 rows in set (0.00 sec)

我来说明一下相关的参数
关于我的导入语句,我现在直说两个,其他的参考手册。
character set gbk;

这个字符集一定要写,要不然就会乱码或者只导入一部分数据。


ignore into table


因为name 列加了唯一索引,加这个是为了避免重复数据插入报错。

加入我们再次运行这个导入语句就会发现
Query OK, 0 rows affected (0.00 sec)
Records: 19  Deleted: 0  Skipped:19  Warnings: 0
没有任何值导入,因为里面已经有了相同的值。

这里也可以用replace intotable
MySQL会把相同的先干掉,再插入新的值。
mysql> load datainfile '/tmp/t0.txt' replace into table t0 character set gbk fieldsterminated by ',' enclosed by '"' lines terminated by '\n'(`name`,`age`,`description`);
Query OK, 38 rows affected (0.00 sec)
Records: 19  Deleted: 19 Skipped: 0  Warnings: 0

mysql> select *from t0;
19 rows in set (0.00 sec)


 (`name`,`age`,`description`);

这些也就是具体的表属性了,指明这个就可以导入想要的数据。
2、关于灵活性,其实也就是一个记录功能
如果想在导入的时候记录一下导入的具体时间怎么办?
我们来看看
先加一个时间属性记录导入时间。
mysql> alter tablet0 add update_time timestamp not null;
Query OK, 19 rows affected (0.00 sec)
Records: 19  Duplicates: 0 Warnings: 0
干掉唯一索引
mysql> alter tablet0 drop index idx_name;
Query OK, 19 rows affected (0.00 sec)
Records: 19  Duplicates: 0 Warnings: 0


mysql> load datainfile '/tmp/t0.txt' into table t0 character set gbk fieldsterminated by ',' enclosed by '"' lines terminated by '\n'(`name`,`age`,`description`) setupdate_time=current_timestamp;
Query OK, 19 rows affected (0.00 sec)
Records: 19  Deleted: 0  Skipped:0  Warnings: 0

mysql> select *from t0;
38 rows in set (0.00 sec)


新导入的19条记录时间被记录了下来。
只是之前的数据库没有记录,不过现在不需要这些重复数据了。

干掉他就可以了


mysql> alter tablet0 order by id desc;
Query OK, 38 rows affected (0.01 sec)
Records: 38  Duplicates: 0 Warnings: 0

mysql> alterignore table t0 add unique index idx_name (`name`);
Query OK, 38 rows affected (0.00 sec)
Records: 38  Duplicates: 19 Warnings: 0

mysql> alter tablet0 order by id asc;
Query OK, 19 rows affected (0.01 sec)
Records: 19  Duplicates: 0 Warnings: 0

mysql> select *from t0;

19 rows in set (0.00 sec)

现在是达到了目的了,为啥中途要干掉唯一索引呢?因为set 语法 再有IGNORE 的时候会忽略掉。

所属分类:编程相关Mysql    作者:新浪博客    时间:2010-11-20 0:00:00

文章导航