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"#李#白"#"libai@hotmail.com"
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#李白#libai@hotmail.com
1005#杜牧#dumu@hotmail.com
1006#杜甫#dufu@hotmail.com
1007#苏轼#sushi@hotmail.com
利用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 | 李白 | libai@hotmail.com
| 1005 | 杜牧 | dumu@hotmail.com
| 1006 | 杜甫 | dufu@hotmail.com
| 1007 | 苏轼 | sushi@hotmail.com |
+------+------+--------------------+
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这些,它是将数据原汁原味输出到文件。但是只能输出一个记录,用处不大。
MySQL学习笔记十一:数据导入与导出的更多相关文章
- ArcGIS案例学习笔记_3_2_CAD数据导入建库
ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...
- sqoop学习2(数据导入与导出)
最近学习了下这个导数据的工具,但是在export命令这里卡住了,暂时排不了错误.先记录学习的这一点吧 sqoop是什么 sqoop(sql-on-hadoop):是用来实现结构型数据(如关系型数据库) ...
- mysql数据库中的数据导入与导出
需求: 在本地电脑上的mysql中创建了一个数据库,并且在该数据库中创建了很多表,表中数据比较多: 现在想换一台电脑,但是又不想重新建数据库.建表.造数据. 解决方案: 利用mysql提供的命令,在本 ...
- mysql学习笔记一 —— 数据的增删改查
1.连接mysql mysql 直接回车(是以root身份,密码空,登陆的是本机localhost) [root@www mysql]# mysql -uroot -p123 -S /var/lib/ ...
- MySQL学习笔记之数据存储类型
说明:本文是作者对MySQL数据库数据存储类型的小小总结. Numeric Type (数字类型) 1.TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT主要根据存储字节长度不 ...
- mysql数据库的批量数据导入与导出,性能提升。
少量数据批量导入:1. 先从数据库把唯一键的值查询出来,放在列表2. 将导入的数据遍历取出,看是否存在列表中,若不在,说明数据库没有.3. 定义两个空列表,一个做为插入数据,一个做为更新数据4. 步骤 ...
- MySql学习笔记(一) —— 数据的分组
前面介绍的聚集函数只是用来计算行数,平均数,最大值,最小值而不用检索所有数据.通过count()函数,我们可以计算生产商1003提供的产品数目,但如果我要查询所有生产商提供的商品数,这就需要进行分组查 ...
- MySql学习笔记(四) —— 数据的分组
前面介绍的聚集函数只是用来计算行数,平均数,最大值,最小值而不用检索所有数据.通过count()函数,我们可以计算生产商1003提供的产品数目,但如果我要查询所有生产商提供的商品数,这就需要进行分组查 ...
- 三十一.MySQL存储引擎 、 数据导入导出 管理表记录 匹配条件
1.MySQL存储引擎的配置 查看服务支持的存储引擎 查看默认存储类型 更改表的存储引擎 设置数据库服务默认使用的存储引擎 1.1 查看存储引擎信息 mysql> SHOW ENGINES\G ...
随机推荐
- MYSQL的安装
1.将mysql的安装文件放入虚拟机 2.搭建yum库 3.依次安装mysql的5个文件 最后一个server需要的依赖太多,所以用yum进行安装. 6.进行mysql的重置 mysql_instal ...
- MySql UDF 调用外部程序和系统命令
1.mysql利用mysqludf的一个mysql插件可以实现调用外部程序和系统命令 下载lib_mysqludf_sys程序:https://github.com/mysqludf/lib_mysq ...
- 转:CentOS, 找不到dump命令:command not found
dump 功能说明:备份文件系统.语 法:dump [-cnu][-0123456789][-b <区块大小>][-B <区块数目>][-d <密度>][-f &l ...
- 工作总结_sql
今天客户叫导入数据,因为存在特殊字符,快把我给玩死了,,所以请教...总结 sql 数据导入excel 存在特殊字符引起的数据缺失 利用字符方式 : select a.OpenID+', ...
- First Day:Starting My Coding Road
今天是2015年7月28日,星期二,晴,下午坐在科创园2楼的办公室里,窗明几净,继续我全新的Android之旅! 在调试和比较了N多IDE集成开发环境之后,最终决定在IDEA SDK环境下试试手,在已 ...
- 编写一个基本的连接池来实现连接的复用&一些工程细节上的优化
package it.cast.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQL ...
- 在iOS中使用ZXing库[转]
前言 ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, ...
- 基于zookeeper实现统一资源管理
分布式系统中经常涉及到配置资源的管理,比如,一个应用系统需要部署在多台服务器上,但是他们拥有某些的配置项是相同的,如果配置变更,需要修改这些配置,那么需要同时修改每台服务器,这样做比较麻烦而且容易出错 ...
- 剑指Offer面试题:26.字符串的排列
一.题目:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 二 ...
- log4j.xml的实用例子
大多数讲log4j配置的教程用的都是log4j.properties文件,我觉得xml或许更好一点,在这里我提供一个我已经用于生产环境的log4j.xml的例子,先上代码,然后再解释: <?xm ...