使用SELECT…INTO OUTFILE导出文本文件
MySQL数据库导出数据时,允许使用包含导出定义的SELECT语句进行数据的导出操作。该文件被创建到服务器主机上,因此必须拥有文件写入权限(FILE权限)才能使用此语法。“SELECT...INTO OUTFILE 'filename'”形式的SELECT语句可以把被选择的行写入一个文件中,并且filename不能是一个已经存在的文件。SELECT...INTO OUTFILE语句的基本格式如下:
SELECT columnlist FROM table WHERE condition INTO OUTFILE 'filename' [OPTIONS]
可以看到SELECT columnlist FROM table WHERE condition为一个查询语句,查询结果返回满足指定条件的一条或多条记录;INTO OUTFILE语句的作用就是把前面SELECT语句查询出来的结果,导出到名称为“filename”的外部文件中;[OPTIONS]为可选参数选项,OPTIONS部分的语法包括FIELDS和LINES子句,其可能的取值如下:
- FIELDS TERMINATED BY 'value':设置字段之间的分隔字符,可以为单个或多个字符,默认情况下为制表符(\t)。
- FIELDS [OPTIONALLY] ENCLOSED BY 'value':设置字段的包围字符,只能为单个字符,若使用了OPTIONALLY关键字,则只有CHAR和VERCHAR等字符数据字段被包围。
- FIELDS ESCAPED BY 'value':设置如何写入或读取特殊字符,只能为单个字符,即设置转义字符,默认值为“\”。
- LINES STARTING BY 'value':设置每行数据开头的字符,可以为单个或多个字符,默认情况下不使用任何字符。
- LINES TERMINATED BY 'value':设置每行数据结尾的字符,可以为单个或多个字符,默认值为“\n”。
FIELDS和LINES两个子句都是自选的,但是如果两个都被指定了,则FIELDS必须位于LINES的前面。
使用SELECT...INTO OUTFILE语句,可以非常快速地把一张表转储到服务器上。如果想要在服务器主机之外的部分客户主机上创建结果文件,不能使用SELECT...INTO OUTFILE,应该使用“MySQL –e "SELECT ..." > file_name”这类的命令来生成文件。
SELECT...INTO OUTFILE是LOAD DATA INFILE的补语,用于语句的OPTIONS部分的语法包括部分FIELDS和LINES子句,这些子句与LOAD DATA INFILE语句同时使用。
【例11.10】使用SELECT...INTO OUTFILE将test_db数据库中的person表中的记录导出到文本文件,SQL语句如下:
mysql> SELECT * FROM test_db.person INTO OUTFILE 'D:/person0.txt';
语句执行后报错信息如下:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
这是因为MySQL默认对导出的目录有权限限制,也就是说使用命令行进行导出的时候,需要指定目录。那么指定的目录是什么呢?
查询指定目录的命令如下:
show global variables like '%secure%';
执行结果如下:
+-------------------------+-----------------------------------------------+
| Variable_name | Value |
+-------------------------+-----------------------------------------------+
|require_secure_transport | OFF |
|secure_file_priv | D:\ProgramData\MySQL\MySQL Server 9.0\Uploads\|
+-------------------------+-----------------------------------------------+
因为secure_file_priv配置的关系,所以必须导出到D:\ProgramData\MySQL\MySQL Server 9.0\Uploads\目录下,该目录就是指定目录。如果想自定义导出路径,需要修改my.ini配置文件。打开路径D:\ProgramData\MySQL\MySQL Server 9.0,用记事本打开my.ini文件,然后搜索以下代码:
secure-file-priv="D:/ProgramData/MySQL/MySQL Server 9.0/Uploads"
在上述代码前添加#注释掉,然后添加以下内容:
secure-file-priv="D:/"
结果如图11.1所示。

重启MySQL服务器后,再次使用SELECT...INTO OUTFILE将test_db数据库中的person表中的记录导出到文本文件,SQL语句如下:
mysql>SELECT * FROM test_db.person INTO OUTFILE 'D:/person0.txt';
Query OK, 1 row affected (0.01 sec)
由于指定了INTO OUTFILE子句,因此SELECT会将查询出来的3个字段值保存到C:\person0.txt文件中。打开该文件,内容如下:
1 Green 21 Lawyer
2 Suse 22 dancer
3 Mary 24 Musician
4 Willam 20 sports man
5 Laura 25 \N
6 Evans 27 secretary
7 Dale 22 cook
8 Edison 28 singer
9 Harry 21 magician
10 Harriet 19 pianist
默认情况下,MySQL使用制表符(\t)分隔不同的字段,字段没有被其他字符包围。另外,第5行中有一个字段值为“\N”,表示该字段的值为NULL。默认情况下,当遇到NULL时,会返回“\N”,代表空值,其中的反斜线(\)表示转义字符;如果使用ESCAPED BY选项,则N前面为指定的转义字符。
【例11.11】使用SELECT...INTO OUTFILE语句,将test_db数据库person表中的记录导出到文本文件,使用FIELDS选项和LINES选项,要求字段之间使用逗号分隔,所有字段值用双引号引起来,定义转义字符为单引号“\'”,SQL语句如下:
SELECT * FROM test_db.person INTO OUTFILE "D:/person1.txt"
FIELDS
TERMINATED BY ','
ENCLOSED BY '\"'
ESCAPED BY '\''
LINES
TERMINATED BY '\r\n';
该语句将把person表中所有记录导入D盘目录下的person1.txt文本文件中。
“FIELDS TERMINATED BY ','”表示字段之间用逗号分隔;“ENCLOSED BY '\"'”表示每个字段用双引号引起来;“ESCAPED BY '\'”表示将系统默认的转义字符替换为单引号;“LINES TERMINATED BY '\r\n'”表示每行以回车换行符结尾,保证每一条记录占一行。
执行成功后,在D盘下生成一个person1.txt文件。打开文件,内容如下:
"1","Green","21","Lawyer"
"2","Suse","22","dancer"
"3","Mary","24","Musician"
"4","Willam","20","sports man"
"5","Laura","25",'N'
"6","Evans","27","secretary"
"7","Dale","22","cook"
"8","Edison","28","singer"
"9","Harry","21","magician"
"10","Harriet","19","pianist"
可以看到,所有的字段值都被双引号引起来;第5条记录中空值的表示形式为“N”,即使用单引号替换了反斜线转义字符。
【例11.12】使用SELECT...INTO OUTFILE语句,将test_db数据库person表中的记录导出到文本文件,使用LINES选项,要求每行记录以字符串“>”开始、以字符串“<end>”结尾,SQL语句如下:
SELECT * FROM test_db.person INTO OUTFILE "D:/person2.txt"
LINES
STARTING BY '> '
TERMINATED BY '<end>';
语句执行成功后,在D盘下生成一个person2.txt文件。打开该文件,内容如下:
"1","Green","21","Lawyer"
"2","Suse","22","dancer"
"3","Mary","24","Musician"
"4","Willam","20","sports man"
"5","Laura","25",'N'
"6","Evans","27","secretary"
"7","Dale","22","cook"
"8","Edison","28","singer"
"9","Harry","21","magician"
"10","Harriet","19","pianist"
可以看到,虽然将所有的字段值导出到文本文件中,但是所有的记录没有分行,出现这种情况是因为TERMINATED BY选项替换了系统默认的换行符。如果希望换行显示,则需要修改导出语句:
SELECT * FROM test_db.person INTO OUTFILE "D:/person3.txt"
LINES
STARTING BY '> '
TERMINATED BY '<end>\r\n';
执行完语句之后,换行显示每条记录,结果如下:
> 1 Green 21 Lawyer <end>
> 2 Suse 22 dancer <end>
> 3 Mary 24 Musician <end>
> 4 Willam 20 sports man <end>
> 5 Laura 25 \N <end>
> 6 Evans 27 secretary <end>
> 7 Dale 22 cook <end>
> 8 Edison 28 singer <end>
> 9 Harry 21 magician <end>
> 10 Harriet 19 pianist <end>
使用SELECT…INTO OUTFILE导出文本文件的更多相关文章
- MySQL运维之---mysqldump备份、select...into outfile、mysql -e 等工具的使用
1.mysqldump备份一个数据库 mysqldump命令备份一个数据库的基本语法: mysqldump -u user -p pwd dbname > Backup.sql 我们来讲解一下备 ...
- 逻辑备份,mysqldump,SELECT…INTO OUTFILE,恢复
逻辑备份 mysqldump mysqldump备份工具最初由Igor Romanenko编写完成,通常用来完成转存(dump)数据库的备份以及不同数据库之间的移植,例如从低版本的MySQL数据库升级 ...
- select into outfile 与 load data infile
select into outfile用法 MySQL中,可以使用SELECT...INTO OUTFILE语句将表的内容导出为一个文本文件. SELECT [列名] FROM table [WHER ...
- 逻辑备份(mysqldump/select into outfile)
#mysqldump备份 shell> mysqldump -uroot -p -P4306 sakila actor>E:\sakila-actor.sql shell> mysq ...
- 使用MySQL的SELECT INTO OUTFILE ,Load data file,Mysql 大量数据快速导入导出
使用MySQL的SELECT INTO OUTFILE .Load data file LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中.当用户一前一后地使用SELECT ...
- Mysql命令下导出select查询数据之 select ... into outfile方法
Mysql日常使用中经常遇到将select查询的数据导出到本地目录的情况,以便数据备份.分析等. 接下来将介绍Mysql终端下使用 select ... into outfile 语句导出数据方法 命 ...
- MySQL select into outfile 和 load data infile数据跨库转移
select into outfile用法 SELECT ... FROM TABLE_A INTO OUTFILE "/path/to/file" FIELDS TERMINAT ...
- mysql导入导出文本文件
MySQL导入出文本文件只能到处数据,不能到处结构,不过也算备份数据一种方法. 导入文本文件 在此像导入csv文件 也是类似 load data local infile 'd:/insert.txt ...
- select into outfile的sql语句
SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据.但是这种方法只能导出或导入数据的内容,不包括表的结构,如果 ...
- mysql load data infile的使用 和 SELECT into outfile备份数据库数据
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE t ...
随机推荐
- ASP.NET Core – Handle Error on Web API
前言 上一篇讲了 ASP.NET Core – Handle Error on Razor Page 这一篇继续说说 Web API 的错误处理. 主要参考 Handle errors in ASP. ...
- 微信js-sdk接入原理
1.有一个微信公众号,并获取到该公众号的AppID和AppSecret. 其中AppID是可以对外公开的,AppSecret是该公众号的密钥,是需要绝对保密的 2.向微信服务器发送一个GET请求,获取 ...
- QT网络编程之如何使用QT6框架QTcpServer和QTcpSocket网络编程实现变长数据包收发:以用户注册和登录为实例讲解
QT网络编程之如何使用QT6框架QTcpServer和QTcpSocket网络编程实现变长数据包收发:以用户注册和登录为实例讲解 简介 本文将介绍如何使用QT6框架QTcpServer和QTcpSoc ...
- Sketch Measure切图插件无法导出标注 (换插件绕过解决)
环境 MacOS 10.15+ sketch版本 69.2 插件版本 2.8.1 遇到的问题 导出标注卡死 更新版本无解,到插件的github issue中找到解决方法 使用MeaXure插件,git ...
- [33](CSP 集训)CSP-S 模拟 4
A 商品 对于任意一组相邻的数 \((l,r)\ (l\le r)\),可以发现,不管怎么压缩,都会有 \(l\le r\),也就是说,相邻两个数的大小关系是不变的 那么我们就可以把 \(\sum(| ...
- LeetCode 650. 2 Keys Keyboard(只有两个键的键盘)(DP/质因数分解)
最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Paste (粘贴) : ...
- ARM64 SMP多核启动(下)- PSCI
4.支持psci情况 上面说了pin-table的多核启动方式,看似很繁琐,实际上并不复杂,无外乎主处理器唤醒从处理器到指定地址上去执行指令,说他简单是相对于功能来说的,因为他只是实现了从处理器的启动 ...
- YashanDB个人版正式开放下载!参与首批体验官活动赢好礼!
好消息!国产数据库YashanDB个人版已正式向所有用户和开发者全面开放下载,该版本已在官网同步上线,欢迎大家前往官网下载体验! 与此同时,YashanDB联合墨天轮技术社区启动首批「产品体验官」尝鲜 ...
- iOS上架App Store使用小结
1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...
- log4j2配置自定义filter报错Unable to invoke factory method in class
报错Unable to invoke factory method in class com....log4j.ScheduleLoggerFilter 2020-05-13 16:32:35,613 ...