13.2.9.1 SELECT ... INTO 语句
选择...进入形式SELECT使查询结果可以存储在变量中或写入文件:
-
SELECT ... INTO var_list
选择列值并将其存储到变量中。 -
SELECT ... INTO OUTFILE
将选定的行写入文件。可以指定列和行终止符以产生特定的输出格式。 -
SELECT ... INTO DUMPFILE
将单行写入文件而没有任何格式。
给定的SELECT语句最多可以包含一个INTO
子句,尽管如SELECT语法说明所示(请参见第 13.2.9 节“ SELECT 语句”),INTO
可以出现在不同的位置:
- 在
FROM
之前。例:
SELECT * INTO @myvar FROM t1;
- 在尾随锁定子句之前。例:
SELECT * FROM t1 INTO @myvar FOR UPDATE;
INTO
子句不应在嵌套的SELECT中使用,因为此类SELECT必须将其结果返回到外部上下文。在UNION语句中使用INTO
也有一些限制;参见第 13.2.9.3 节“ UNION 子句”。
对于INTO var_list
变体:
-
var_list
*列出一个或多个变量的列 table,每个变量可以是用户定义的变量,存储过程或函数参数或存储程序局部变量。 (在准备好的SELECT ... INTO var_list
语句中,仅允许用户定义变量;请参见第 13.6.4.2 节“局部变量的范围和解决方案”。)
-
所选值将分配给变量。变量数必须与列数匹配。查询应返回一行。如果查询不返回任何行,则会出现错误代码 1329 的警告(
No data
),并且变量值保持不变。如果查询返回多行,则会出现错误 1172(Result consisted of more than one row
)。如果该语句可能检索多行,则可以使用LIMIT 1
将结果集限制为单行。
SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
用户变量名称不区分大小写。参见第 9.4 节“用户定义的变量”。
SELECT ... INTO OUTFILE'文件名'形式SELECT将选定的行写入文件。该文件是在服务器主机上创建的,因此您必须具有FILE特权才能使用此语法。 * file_name
*不能是现有文件,这尤其可以防止修改/etc/passwd
和数据库 table 之类的文件。 character_set_filesystem系统变量控制文件名的解释。
选择...进入外档语句旨在启用将 table 转储到服务器主机上的文本文件的功能。要在其他主机上创建结果文件,通常不适合使用选择...进入外档,因为除非有网络可访问远程主机上的文件位置,否则无法写入相对于服务器主机文件系统的文件路径。服务器主机文件系统上的-mapped 路径。
或者,如果将 MySQLClient 端软件安装在远程主机上,则可以使用诸如mysql -e "SELECT ..." > file_name
之类的 Client 端命令在该主机上生成文件。
选择...进入外档是LOAD DATA的补码。将列值转换为CHARACTER SET
子句中指定的字符集。如果不存在此类子句,则使用binary
字符集转储值。实际上,没有字符集转换。如果结果集包含多个字符集中的列,则输出数据文件也将包含列,并且可能无法正确地重新加载文件。
语句的* export_options
*的语法由与LOAD DATA语句一起使用的FIELDS
和LINES
子句组成。有关FIELDS
和LINES
子句的信息,包括它们的默认值和允许的值,请参见第 13.2.6 节“ LOAD DATA 语句”。
FIELDS ESCAPED BY
控制如何写特殊字符。如果FIELDS ESCAPED BY
字符不为空,则在必要时使用该字符以避免歧义,因为前缀是输出中以下字符之前的前缀:
-
FIELDS ESCAPED BY
个字符 -
FIELDS [OPTIONALLY] ENCLOSED BY
个字符 -
FIELDS TERMINATED BY
和LINES TERMINATED BY
值的第一个字符 -
ASCII
NUL
(零值字节;转义字符后实际写的是 ASCII0
,而不是零值字节)
必须转义FIELDS TERMINATED BY
,ENCLOSED BY
,ESCAPED BY
或LINES TERMINATED BY
字符,以便您可以可靠地读回文件。 ASCII NUL
被转义以使其更易于使用某些寻呼机查看。
生成的文件不需要符合 SQL 语法,因此不需要进行其他任何转义。
如果FIELDS ESCAPED BY
字符为空,则不转义任何字符,并且将NULL
输出为NULL
而不是\N
。指定一个空的转义字符可能不是一个好主意,特别是如果数据中的字段值包含刚给出的列 table 中的任何字符时,尤其如此。
这是一个以许多程序使用的逗号分隔值(CSV)格式生成文件的示例:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
如果您使用INTO DUMPFILE
而不是INTO OUTFILE
,则 MySQL 仅将一行写入文件,没有任何列或行终止,也没有执行任何转义处理。这对于选择BLOB值并将其存储在文件中很有用。
Note
由INTO OUTFILE
或INTO DUMPFILE
创建的任何文件都可由服务器主机上的所有用户写入。原因是 MySQL 服务器无法创建一个文件,该文件由运行该帐户的用户以外的任何人拥有。 (由于这个和其他原因,切勿以root
的身份运行mysqld。)因此,该文件必须是可全局写入的,以便您可以操纵其内容。
如果secure_file_priv系统变量设置为非空目录名称,则要写入的文件必须位于该目录中。
在作为事件计划程序执行的事件的一部分出现的选择...进入语句的上下文中,诊断消息(不仅错误,而且警告)被写入错误日志,并在 Windows 上写入应用程序事件日志。有关更多信息,请参见第 23.4.5 节“事件调度程序状态”。