MySQL数据导入与导出
基本说明
本文主要介绍MySQL数据库从文件导入数据,以及导出数据到文件的简单方法,其中包括select into outfile和load data infile语句的语法介绍,以及mysqlimport命令的使用说明。对于常用于导出数据或备份数据的mysqldump命令,则请参看数据库备份相关文章。
本文介绍的用于导入数据或者数据导出的文件为纯文件文件,常见的文件格式一般为txt和csv。其中,txt文件为一般文本文件;csv文件则一般是使用逗号分隔不同字段、使用换行符分隔多条记录的文件。
相关语句语法简介
以下语句的语法并非标准SQL的语法,仅使用于MySQL数据库。不同的数据库请参考相关的文档。
load data infile
load data infile语句用于快速导入文本文档的记录到数据表中。相比于使用insert语句进行插入,使用load data infile语句的导入速度一般是其20倍。
MySQL官方文档中给出的语法如下:
|
|
部分参数的简要说明:
file_name为用于导入的数据文件的文件名,必须通过字符串字面量给出(用单引号或双引号转义即可)。CHARACTER SET用来指定文件的字符集,在输入文件的字符集与数据库默认字符集不同时使用。LOW_PRIORITY、CONCURRENT用于指定导入数据时的优先级,对于不同的存储引擎有不同的行为。LOCAL用于指定文件查找的位置:- 如果设置了
LOCAL,则文件会从客户端的系统中获取,并通过客户端发送到数据库服务器上,再有数据库服务器读取并进行导入。 - 如果没有设置
LOCAL,则文件必须存在于数据库服务器的文件系统中。 - 不同情况下,使用相对路径的文件名查找文件的位置有差异,所以建议使用绝对路径来指定文件名。
- 如果设置了
REPLACE、IGNORE用于控制插入数据时出现唯一键冲突时的处理方法REPLACE,新的记录会替代已经存在的记录IGNORE,冲突的记录会被忽略并跳过- 如果不指定,则会根据
LOCAL参数决定处理方式- 设置
LOCAL的情况下,行为同IGNORE - 没有
LOCAL的情况下,产生错误并停止处理流程
- 设置
IGNORE ... LINES可以用于忽略前面几行无效的数据FIELDS、LINES的使用方法与在select into outfile语句中的使用方法大致相同,故在后面单独列出来。
导入数据时,可以指定数据列与所读取的字段的对应关系:
对于不需要插入的字段,可以将值赋予变量:
使用SET可以为数据表中某些列赋给不是直接从文件中读取出来的值,也可以使用之前赋给变量的值:
select into outfile
MySQL官方文档中给出的语法如下:
|
|
部分参数说明的简要说明:
file_name是输出到数据库服务器的文件系统中的文件,必须不能是一个已经存在的文件名(不能覆盖已有文件)。CHARACTER SET指定输出文件的字符集。FIELDS、LINES的使用方法与在load data infile语句中的使用方法大致相同,在后面小节中单独列出来。
fields、lines
|
|
对于load data infile和select into outfile语句,FIELDS和LINES部分的语法是相同的。FIEDLS和LINES都是可选的配置参数,但如果都要配置,FIELDS必须在LINES的前面。
如果你没有指定FIELDS LINES,则采用的默认参数为:
对于FIELDS:
TERMINATED BY指定用于分隔不同字段的字符(可以是多个字符),一般使用制表符\t、逗号,。[OPTIONALLY] ENCLOSED BY指定用于包裹字段的字符(单个字符),一般使用单引号'、双引号"。- 如果设置
OPTIONALLY参数,则字段只会在必要情况下(字符型字段,CHAR,TEXT,BINARY,ENUM等)才进行包裹。 - 如果值为空,即
ENCLOSED BY '',则表示不使用引用来包裹字段。
- 如果设置
ESCAPED BY指定用于转义字符的值(单个字符),建议使用MySQL的默认值,即反斜线,ESCAPED BY '\\'。
对于LINES:
TERMINATED BY指定用于分隔不同记录的字符(可以是多个字符),一般使用换行符\n或Windows换行符\r\n。- 如果该参数值设为空,则不同记录依然会使用
FIELDS TERMINATED BY参数的值来分隔
- 如果该参数值设为空,则不同记录依然会使用
STARTING BY仅对导入数据有效,用于指定每行记录需要忽略的前缀- 该前缀以及其之前的字符会被忽略
- 不存在该前缀的行会被忽略
mysqlimport命令参数
mysqlimport命令提供命令行下调用load data infile语句的接口,其大部分的参数直接对应于load data infile语句的语法。
使用mysqlimport命令的基本格式如下:
对于命令中给出的多个文件名,mysqlimport会去除文件名中的扩展名,作为要导入的数据表的名称。如patient.txt、patient.csv、patient这样的文件最终都会导入到同一张数据表patient中。
其常用的参数如下:
注意在使用mysqlimport命令时,也需要指定数据库连接相关的参数,参数格式类似与mysql命令:
操作示例
导入csv格式的数据
对于以下格式的csv数据,
导入数据前,如果不存在相应的表,则要先创建保存数据的数据表。在创建表时,可以先把列定义的宽泛一些,导入数据之后再修改结构。
使用以下SQL语句导入csv数据:
操作完成后,如果提示有warning,则可以使用show warning查看警告信息,并进行处理。
导出csv格式的数据
使用与导入csv数据类似的FIELDS、LINES参数,即可导出数据为csv文件。
注意:相比导入数据,导出数据时,指定参数最好明确一些。导入数据时,只要保证能正常导入即可。后面通过其它SQL语句处理也是很方便的。
导出其它格式的数据
常用的格式化数据经常使用制表符’\t’来分隔不同字段,这种类型的数据,复制之后,可以直接应用于Word中行列数相匹配的表格中。我们导出数据时,只要通过指定FIELDS TERMINATED BY '\t'即可导出这种数据。
与mysqldump命令导出、导入数据的对比
使用
mysqldump命令导出的文件为SQL文件,里面可以包含数据表的结构信息,多用于数据库备份和恢复,也可以用于不同数据库之间数据交换。使用
select into outfile导出的文件为最基本的纯文本,而且格式更加自由灵活(可以通过select语句生成各种数据),一般用于跟其他程序交换数据。
我们可以根据最终目的来选择使用那种方式来进行操作:
- 如果为了备份和恢复数据,使用
mysqldump命令 - 如果为了导入其他格式化的数据,使用
load data infile语句 - 如果为了导出数据供其他程序(如Excel)使用,使用
select into outfile语句