SELECT ... INTO Statement (输出重定向)

三种重定向介绍

select ... into使得mysql查询结果能存储在变量或者文件中:

  • select ... into var_list使得查询结果存储在一个变量列表中
  • select ... into outfile使得查询结果存储在一个文件中,同时可以指定列和行的终止符
  • select ... into dumpfile使得单行结果写入文件并不附带任何格式化

测试数据建立

create table t(nValue int, Str varchar(100), bStr blob);

insert into t(nValue, Str, bStr) values(1, "szn", 0x1234), (2, "slz", 0xFFAA), (3, null, null);

输出重定向到变量

​ 输出重定向到变量时,变量的个数必须匹配select列的个数,并且查询结果必须有且只有一行(查询结果为空时,会触发代号为1329的warning。查询结果为多行时,会触发代号为1172的error)。

select nValue, Str, bStr into @x, @y, @z from t limit 1;
select @x, @y, @z, hex(@z);
@x @y @z hex(@z)
1 szn �4 1234

输出重定向到文件(outfile)

  • 输出重定向到文件时,这个文件是创建在server端的
  • 重定向的输出文件在指定的路径上必须不存在
  • my.ini文件中的secure_file_priv会影响导出路径的选择
select * from t into outfile 'd:/1.txt';
--上述查询结果:[Err] 1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
--上述语句执行失败原因及解决方案下文将进行解释
select * from t into outfile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\1.txt';
--生成的文件内容(16进制显示):31 09 73 7A 6E 09 12 34 0A 32 09 73 6C 7A 09 FF AA 0A 33 09 5C 4E 09 5C 4E 0A

重定向路径

​ 在之前查询时,之所以第一次失败而第二次成功的原因是my.ini中指定了secure-file-priv="C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\",这就导致了重定向的路径前缀必须是指定的值。可以修改此变量的值secure-file-priv=""并重启mysql服务,再次执行即可成功:

select * from t into outfile 'd:/1.txt';
--受影响的行: 3
show variables like 'secure_file_priv';
--上述语句可用于查看my.ini中secure_file_priv的设定值

终止符设定

列终止符设定:fields TERMINATED by

行终止符设定:lines TERMINATED by

select * from t into outfile 'd:/1.txt' fields TERMINATED by ',' lines TERMINATED by '\r\n';
--输出文件内容(16进制显示):31 2C 73 7A 6E 2C 12 34 0D 0A 32 2C 73 6C 7A 2C FF AA 0D 0A 33 2C 5C 4E 2C 5C 4E 0D 0A

输出重定向到文件(dumpfile)

select * from t limit 1 into DUMPFILE 'd:/1.txt';
--输出文件内容(16进制显示):31 73 7A 6E 12 34

select * from t limit 1, 1 into DUMPFILE 'd:/1.txt';
--输出文件内容(16进制显示):32 73 6C 7A FF AA

select * from t limit 2, 1 into DUMPFILE 'd:/1.txt';
--输出文件内容(16进制显示):33 00 00

参考资料:

https://dev.mysql.com/doc/refman/8.0/en/select-into.html

你可能感兴趣的:(SELECT ... INTO Statement (输出重定向))