MySQL学习笔记十一:数据导入与导出

数据导入

1.mysqlimport命令行导入数据

在使用mysqlimport命令导入数据时,数据来源文件名要和目标表一致,不想改文件名的话,可以复制一份创建临时文件,示例如下。

建立一个文本users.txt,内容如下:

1001,张三,zhangsan@163.com
1002,李四,zhangsan@126.com
1003,王五,zhangsan@qq.com
1004,李白,zhangsan@hotmail.com

创建一个表users

mysql> create table if not exists users(
    -> id int(11) not null default 1000,
    -> name varchar(50),
    -> email varchar(50)
    -> );
Query OK, 0 rows affected (0.15 sec)

使用mysqlimport将users.txt中数据导入users表

PS F:\> mysqlimport -u root -p123456 zz --default-character-set=gbk --fields-terminated-by=‘,‘ f:\users.txt
zz.users: Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
-----------------------------验证----------------------------------
mysql> select * from users\G
*************************** 1. row ***************************
   id: 1003
 name: 王五
email: wangwu@163.com
*************************** 2. row ***************************
   id: 1001
 name: 张三
email: zhangsan@163.com
*************************** 3. row ***************************
   id: 1002
 name: 李四
email: lisi@hotmail.com

分列,使用--fields-terninated-by参数来指定每列的分隔符,例如:

1004#李白#libai@hotmail.com  --文本内容
---------------------------验证----------------------------------
PS F:\> mysqlimport -u root -p7758520 zz  --fields-terminated-by=‘#‘ f:\users.txt
zz.users: Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from users;
+------+------+-------------------+
| id   | name | email             |
+------+------+-------------------+
| 1004 | 李白 | libai@hotmail.com |
+------+------+-------------------+
1 row in set (0.00 sec)

如果列值中出现了分隔符,例如 1004"#李#白"#"[email protected]"

PS F:\> mysqlimport -u root -p7758520 zz  --fields-terminated-by=‘#‘ --fields-enclosed-by=\"  f:\users.txt

如果遇到一条记录有多行,则可以使用--lines-terminated-by=name来指定行的结束符

PS F:\> mysqlimport -u root -p7758520 zz  --fields-terminated-by=‘#‘ --fields-enclosed-by=\"  --lines-terminated-by=‘xxx\n‘ f:\users.txt

2.使用Load Data语句导入数据

Load Data 语句的使用语法如下:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘file_name‘
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY ‘string‘]
        [[OPTIONALLY] ENCLOSED BY ‘char‘]
        [ESCAPED BY ‘char‘]
    ]
    [LINES
        [STARTING BY ‘string‘]
        [TERMINATED BY ‘string‘]
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...]

刚开始看到这个语法吓了一跳,这么长,其实没这么复杂,一般只需记住LOAD DATA INFILE file_name INTO TABLE tb_name这个即可,示例:

首先创建一个表sql_users,利用上面的users表复制一下

mysql> create table sql_users as select * from users;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> truncate table sql_users;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from sql_users;
Empty set (0.00 sec)

文本sql_users.txt

1004#李白#[email protected]
1005#杜牧#[email protected]
1006#杜甫#[email protected]
1007#苏轼#[email protected]

利用LOAD DATA INFILEE语句导入数据

mysql> load data infile ‘f:\sql_users.txt‘ into table sql_users fields terminated by ‘#‘;
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from sql_users;
+------+------+--------------------+
| id   | name | email              |
+------+------+--------------------+
| 1004 | 李白 | [email protected]
| 1005 | 杜牧 | [email protected]
| 1006 | 杜甫 | [email protected]
| 1007 | 苏轼 | [email protected]  |
+------+------+--------------------+
4 rows in set (0.00 sec)

如果在导入数据时,遇到字符串无法识别时,一般都是字符集有问题,使用charset选项即可解决

mysql> load data infile ‘f:\sql_users.txt‘ into table sql_users  fields terminated by ‘#‘;
ERROR 1366 (HY000): Incorrect string value: ‘\xC0\xEE\xB0\xD7‘ for column ‘name‘ at row 1
--------------------------------字符集不一样-----------------------
mysql> load data infile ‘f:\sql_users.txt‘ into table sql_users  character set gbk fields terminated by ‘#‘;
Query OK, 4 rows affected (0.03 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

LOAD DATA INFILE命令默认要导入数据存放在服务上,如果要导入客户端的数据,可以指定LOCAL,那么mysql将从客户端读取数据,这样的方式会比服务器上操作要慢一点,因为客户端的数据需要通过网络传输到服务器。

mysql> load data local infile ‘f:\sql_users.txt‘ into table sql_users  fields terminated by ‘#‘;

如果需要忽略与主键值重复的记录值或者替换重复值,可以使用IGNORE或REPLACE选项,但是LOAD DATA INFILE命令语法中有两处IGNORE关键字,前面一个是用来此功能的,后面一个用来指定需要忽略的前N条记录。

--------------------文本中的内容----------
PS F:\> MORE .\sql_users.txt
1004#李白#libai@hotmail.com
1005#杜牧#dumu@hotmail.com
1006#杜甫#dufu@hotmail.com
1007#苏轼#sushi@hotmail.com
1007#苏轼#sushi@hotmail.com
-----------------------导入-------------------
mysql> LOAD DATA INFILE ‘F:\sql_users.txt‘ IGNORE INTO TABLE sql_users CHARACTER SET GBK FIELDS TERMINATED BY ‘#‘;
Query OK, 4 rows affected (0.00 sec)
Records: 5  Deleted: 0  Skipped: 1  Warnings: 0

mysql> select * from sql_users;
+------+------+--------------------+
| id   | name | email              |
+------+------+--------------------+
 |1004 | 李白 | libai@hotmail.com
  |005 | 杜牧 | dumu@hotmail.com
  |006 | 杜甫 | dufu@hotmail.com
 |1007 | 苏轼 | sushi@hotmail.com
+------+------+--------------------+
4 rows in set (0.00 sec)

如果不想导入数据文件的前N行,使用IGNORE N LINES来处理

mysql> SELECT * FROM SQL_USERS;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE ‘F:\sql_users.txt‘ IGNORE INTO TABLE sql_users CHARACTER SET GBK FIELDS TERMINATED BY ‘#‘ IGNORE
 1 LINES;
Query OK, 3 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 1  Warnings: 0

mysql> SELECT * FROM SQL_USERS;
+------+------+--------------------+
| id   | name | email              |
+------+------+--------------------+
  |005 | 杜牧 | dumu@hotmail.com
  |006 | 杜甫 | dufu@hotmail.com
 |1007 | 苏轼 | sushi@hotmail.com
+------+------+--------------------+
3 rows in set (0.00 sec)

如果在数据文件中记录行头有某些字符,又不想被导入,可以使用LINES STARTING BY来解决,但是如果某行记录不包含这些字符的话,那么这行记录也会被忽略。

---------------文本----------------
PS F:\> MORE .\sql_users.txt
zzz1004#李白#libai@hotmail.com
1005#杜牧#dumu@hotmail.com
zzz1006#杜甫#dufu@hotmail.com
1007#苏轼#sushi@hotmail.com
zzz1007#苏轼#sushi@hotmail.com
---------------验证-----------------------
mysql> select * from sql_users;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE ‘F:\sql_users.txt‘ IGNORE INTO TABLE sql_users CHARACTER SET GBK FIELDS TERMINATED BY ‘#‘ LINES
STARTING BY ‘zzz‘;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from sql_users;
+------+------+--------------------+
| id   | name | email              |
+------+------+--------------------+
 |1004 | 李白 | libai@hotmail.com
  |006 | 杜甫 | dufu@hotmail.com
| 1007 | 苏轼 | sushi@hotmail.com  |
+------+------+--------------------+
3 rows in set (0.00 sec)

数据文件为Excel文件的处理,首先将Excel文件保存为CSV格式,这样字段间都是用逗号隔开的,再进行处理。

-----------excel转换成CSV的数据-------------
PS F:\> MORE .\stu.csv
学号,姓名,班级
4010404,祝小贤,A1012
4010405,肖小杰,A1013
4010406,钟小喜,A1014
4010407,钟小惠,A1015
--------------------进行导入--------------------
mysql> CREATE TABLE stu(
    -> sno int not null primary key,
    -> sname varchar(30),
    ->  class char(6)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> LOAD DATA INFILE ‘F:\stu.csv‘ INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ‘,‘ IGNORE 1 LINES;
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM STU;
+---------+--------+--------+
| sno     | sname  | class  |
+---------+--------+--------+
 |4010404 | 祝小贤 | A1012
 |4010405 | 肖小杰 | A1013
 |4010406 | 钟小喜 | A1014
 |4010407 | 钟小惠 | A1015
+---------+--------+--------+
4 rows in set (0.00 sec)

数据文件列值中有特殊符号,使用enclosed by来处理。例如,列值中有分隔符

---------------------文本--------------------
PS F:\> MORE .\stu.csv
学号,姓名,班级
4010404,祝小贤,"A1012,01"
4010405,肖小杰,"A1013,02"
4010406,钟小喜,"A1014,03"
4010407,钟小惠,"A1015,04"
--------------------导入------------------------
mysql> select * from stu;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE ‘F:\stu.csv‘ INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TER
MINATED BY ‘\r\n‘ IGNORE 1 LINES;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from stu;
+---------+--------+----------+
| sno     | sname  | class    |
+---------+--------+----------+
| 4010404 | 祝小贤 | A1012,01 |
| 4010405 | 肖小杰 | A1013,02 |
| 4010406 | 钟小喜 | A1014,03 |
| 4010407 | 钟小惠 | A1015,04 |
+---------+--------+----------+
4 rows in set (0.00 sec)

数据导入时换行符的问题,在上面的示例中,有几个数据导入到表中后,查询时结果显示有点别扭,不知大家注意到了没。

在Windows系统中,文本格式的换行符有"\r+\n"组成,而在linux系统中,换行符是"\n"。因此出出现上述问题,解决方法就是指定换行符LINES TERMINATED BY。

mysql> LOAD DATA INFILE ‘F:\stu.csv‘ INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TERMINATED BY ‘\r\n‘ IGNORE 1 LINES;

表的列数多余数据文件中的列数,解决方法就是指定要导入到表的字段,如下所示

mysql> desc stu;       --查看表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sno   | int(11)     | NO   | PRI | NULL    |       |
| sname | varchar(30) | YES  |     | NULL    |       |
| class | varchar(20) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
---------------------导入数据-------------------
mysql> LOAD DATA INFILE ‘F:\stu.csv‘ INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TER
MINATED BY ‘\r\n‘ IGNORE 1 LINES (SNO,SNAME,CLASS);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM STU;
+---------+--------+-------+------+
| sno     | sname  | class | age  |
+---------+--------+-------+------+
| 4010404 | 祝小贤 | A1012 | NULL |
| 4010405 | 肖小杰 | A1013 | NULL |
| 4010406 | 钟小喜 | A1014 | NULL |
| 4010407 | 钟小惠 | A1015 | NULL |
+---------+--------+-------+------+
4 rows in set (0.00 sec)

如果是表的列数少于数据文件中的列数呢,解决办法可以指定用户变量来接收多余的列值,如下

-------------------文本数据-------------------------
PS F:\> MORE .\stu.csv
学号,姓名,班级
4010404,祝小贤,"A1012",20,male
4010405,肖小杰,"A1013",22,female
4010406,钟小喜,"A1014",24,male
4010407,钟小惠,"A1015",26,female
------------------导入-----------------------------
mysql> LOAD DATA INFILE ‘F:\stu.csv‘ INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TER
MINATED BY ‘\r\n‘ IGNORE 1 LINES (SNO,SNAME,CLASS,AGE,@GENDER);
Query OK, 4 rows affected (0.05 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM STU;
+---------+--------+-------+------+
| sno     | sname  | class | age  |
+---------+--------+-------+------+
| 4010404 | 祝小贤 | A1012 |   20 |
| 4010405 | 肖小杰 | A1013 |   22 |
| 4010406 | 钟小喜 | A1014 |   24 |
| 4010407 | 钟小惠 | A1015 |   26 |
+---------+--------+-------+------+
4 rows in set (0.00 sec)

如果表的列数与数据文件的不同,且某些字段类型都不一致,那怎么解决呢?方法如下:

------------------文本----------------------
PS F:\> MORE .\stu.csv
学号,姓名,班级
4010404,祝小贤,"A1012",20,male,信息学院
4010405,肖小杰,"A1013",22,female,外院
4010406,钟小喜,"A1014",24,male,会计学院
4010407,钟小惠,"A1015",26,female,商学院
--------------------处理-------------------------
mysql> desc stu;   //表结构
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sno    | int(11)     | NO   | PRI | NULL    |       |
| sname  | varchar(30) | YES  |     | NULL    |       |
| class  | varchar(20) | YES  |     | NULL    |       |
| age    | int(11)     | YES  |     | NULL    |       |
| gender | tinyint(4)  | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

mysql> LOAD DATA INFILE ‘F:\stu.csv‘ INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TER
MINATED BY ‘\r\n‘ IGNORE 1 LINES (SNO,SNAME,CLASS,AGE,@GENDER,@x) SET GENDER=IF(@GENDER=‘MALE‘,1,0);
Query OK, 4 rows affected (0.09 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM STU;
+---------+--------+-------+------+--------+
| sno     | sname  | class | age  | gender |
+---------+--------+-------+------+--------+
| 4010404 | 祝小贤 | A1012 |   20 |      1 |
| 4010405 | 肖小杰 | A1013 |   22 |      0 |
| 4010406 | 钟小喜 | A1014 |   24 |      1 |
| 4010407 | 钟小惠 | A1015 |   26 |      0 |
+---------+--------+-------+------+--------+
4 rows in set (0.00 sec)

数据导出

数据导出比较简单,只要会SELECT ...INTO OUTFILE语句即可,例如

mysql> SELECT * FROM STU INTO OUTFILE "F:\stu_bak.txt"  CHARACTER SET GBK FIELDS TERMINATED BY ‘##‘ LINES TERMINATED BY‘\r\n‘;
Query OK, 4 rows affected (0.00 sec)
-------------------------------stu_bak.txt-----------------------
PS F:\> MORE .\stu_bak.txt
4010404##祝小贤##A1012##20##1
4010405##肖小杰##A1013##22##0
4010406##钟小喜##A1014##24##1
4010407##钟小惠##A1015##26##0

还有一个SELECT...INTO DUMPFILE,这个语句也是将数据导出到文件,但是不能格式化语句,如FIELDS,LINES这些,它是将数据原汁原味输出到文件。但是只能输出一个记录,用处不大。

时间: 2024-10-27 08:11:42

MySQL学习笔记十一:数据导入与导出的相关文章

mysql学习笔记——对数据表中记录的操作

对记录的操作,主要有增.删.改.查 一.记录插入命令:insert into 表名(列名,列名, .... ) values(值, 值, ....); 值个数应该列个数相同,值顺序和列顺序相同,值类型和列字段类型匹配 当表名后面省略列名时,values后面要给出所有列的值 插入数据时,字符串添加 单引号 '' ---- 字符型和日期型数据应包含在单引号中 插入数据时,中文乱码问题:将客户端的编码集设置为gbk 修改mysql 配置文件,永久改变客户端编码集 ----- mysql/my.ini

mysql学习笔记——对数据记录查询操作的补充(单表内查询)

select ... from ... where ... group by ... having ... order by ... limit...; (顺序固定) 1.select 指定所要检索的字段(列) select 后加distinct关键字,则可去除重复的记录,其中,重复的记录是指 所有字段值都相同的记录 2.from 指定查询数据表,可以是表名,也可以是别名 通常是在一个表达式不易读取时,对其取别名: 表达式 as 别名; 3.where 前置过滤条件 --- 将表数据过滤掉一部分

三十一.MySQL存储引擎 、 数据导入导出 管理表记录 匹配条件

1.MySQL存储引擎的配置 查看服务支持的存储引擎 查看默认存储类型 更改表的存储引擎 设置数据库服务默认使用的存储引擎 1.1 查看存储引擎信息 mysql> SHOW ENGINES\G 1.2 查看默认存储类型 mysql> SHOW VARIABLES LIKE 'default_storage_engine'; +------------------------+--------+ | Variable_name          | Value  | +-------------

Mysql学习笔记(十一)临时表+视图

原文:Mysql学习笔记(十一)临时表+视图 学习内容: 临时表和视图的基本操作... 临时表与视图的使用范围... 1.临时表   临时表:临时表,想必大家都知道这个概念的存在...但是我们什么时候应该使用到临时表呢?当一个数据库存在着大量的数据的时候,我们想要获取到这个数据集合的一个子集,那么我们就可以使用临时表来保存我们想要的数据..然后对临时表进行操作就可以了...使用临时表必然是有原因的..使用临时表会加快数据库的查询性能.... create temporary table tmp_

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对

MySQL学习笔记之五 有关数据表操作

MySQL在创建表的时候,创建一个.frm文件保存表和列定义.索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中.   一.用SHOW/ DESCRIBE语句显示数据表的信息 语法: SHOW TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM

MySql学习笔记(转载)

/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld --skip-grant-tables-- 修改root密码密码加密函数password()update mysql.user set password=password('root'); SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- /* 数据库操

Mysql学习笔记(二)数据类型 补充

原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与varchar char与varchar的类型相似,但是他们的保存方式和检索方式不同... char的存储结构是固定长度的存储...即指定了几个字节,那么就占用几个字节,如char(4),那么无论存入的是什么字串,那么都占用四个字节...char的 可表示长度范围为0-255的任何值,当保存的字节不

MySql学习笔记(一)之DQL常用查询

MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前,我们先做一些准备工作. 需要安装的软件如下: 1.mysql,版本可以选择5.1或者5.5,安装过程可以参考博客:http://www.cnblogs.com/ixan/p/7341637.html 2.mysql图形化管理软件:Navicate,sqlyog(二选一,推荐使用sqlyog). 本文