SELECT…INTO OUTFILE “filename”语句的功能是将指定的数据导出到文本文件中,并且字段间的分隔符(默认Tab)、字段的封闭符(默认空)以及记录间的分隔符(默认换行)都可以按需指定,使用起来十分方便。
在使用该语句时,有如下几点需要避开的坑:
1.CRLF(Carriage-Return Line-Feed),即回车换行
我们知道,当我们在一个文本编辑器中作业时,写完一个段落后往往会键入一个Enter键将光标移动到新的一行继续作业。
然而,在不同的操作系统中,键入一个Enter键代表着不同的意义:比如,在linux系统中,每行的结尾只有“换行”,即“\n”;在Windows系统中,每行的结尾是“回车换行”,即“\r\n”;在Mac系统中,每行结尾只有“回车”,即“\r”;
这就会存在隐含的陷阱,比如,如果我们在Windows下通过Navicat图形用户界面将一张表的数据导入到本地,随后在Linux系统下通过LOAD DATA INFILE “filename” INTO TABLE tablename将数据导入表中,就可能会出现问题。
建议:select…into outfile导出和load data infile…导入操作在同一个操作系统下完成。
2.命令行与图形用户界面
命令行SELECT…INTO OUTFILE语句在Navicat图形用户界面中也是存在相应的操作的(比如表的导出向导)。
但是,这两种方式存在着某种细微的区别:
在命令行SELECT…INTO OUTFILE中如果我们指定了字段的封闭符,即指定optionally enclosed by”‘”(这里指定字段封闭符为单引号),以这种方式导出的文本文件中int类型(猜测应该是所有数值类型的情况都相同)的字段并没有被单引号括起来,其他字段类型,比如char类型的字段都会被单引号括起来。
而通过图形用户界面,指定字段封闭符为单引号之后,导出的文本文件中的所有字段都会被单引号括起来。
这种情况,也往往隐藏陷阱。
建议:同上,在相同的操作系统下做导出导入操作。
3.权限问题
使用SELECT …INTO OUTFILE将数据导出到指定的文件,要求该文件所在的目录要拥有一定的权限才可以导出,比如我需要将待导出文件所在的目录加入到mysql用户组中,并成为mysql用户(chown mysql:mysql 文件所在目录),才能将数据写入文件。