mysql: load data与select into outfile

1、从数据库导出数据

  • SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
  • 输出不能是一个已存在的文件。防止文件数据被篡改。
  • 你需要有一个登陆服务器的账号来检索文件。否则 SELECT ... INTO OUTFILE 不会起任何作用。
  • 在UNIX中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。
  • LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。

 

下面的例子中,生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用

SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;

可以指定文件格式

SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';

2、向数据库加载数据

MySQL 中提供了LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。

LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。

你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。

两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。

如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。

LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
FIELDS 
TERMINATED BY ':'
ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n' (column_name1, column_name2, ...);
  • FIELDS TERMINATED BY ","   //  字段以”,“分隔
  • FIELDS ENCLOSED BY " "   // 字段闭合标签,例如ENCLOSED BY " "" ",则字段以双引号”“闭合,在双引号内部的字段分隔符都会被忽略
  • FIELDS ESCAPED BY " " // FIELDS ESCAPED BY 控制如何写入或读出特殊字符。如果FIELDS ESCAPED BY 字符不是空的,它将被用于做为下列输出字符的前缀:

    •     FIELDS ESCAPED BY 字符

    •     FIELDS [OPTIONALLY] ENCLOSED BY 字符 。

    •     FIELDS TERMINATED BY 和LINES TERMINATED BY 值的第一个字符。

    •     ASCII 0 (实际上在转义字符后写上ASCII '0',而不是一个零值字节)。

  • LINES TERMINATED BY "\r\n" //Windows 系统下每一行的结束标志,Linux系统应该是LINES TERMINATED BY "\n"或<LINES TERMINATED BY "\r"或可以直接省略。
  • FIELDS [OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必须是一个单个字符。
  • FIELDS TERMINATED BY和LINES TERMINATED BY值可以是超过一个字符。

FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包围字符。对于输出(SELECT ... INTO OUTFILE),如果你省略OPTIONALLY,所有的字段由ENCLOSED BY字符包围。对于这样的输出的一个例子(使用一个逗号作为字段分隔符)显示在下面:

"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"

如果你指定OPTIONALLY,ENCLOSED BY字符仅被用于包围CHAR和VARCHAR字段:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20

如果FIELDS ESCAPED BY 字符为空,那么将没有字符被转义并且NULL 值仍输出为NULL,而不是\N。指定一个空的转义字符可能不是一个好的方法,特别是用户的数据字段值中包含刚才列表中的任何字符时。

对于输入值,如果FIELDS ESCAPED BY 字符不是空字符,则出现这种字符时会被剥离,然后以下字符被作为字段值的一部分。例外情况是,被转义的‘0’或‘N’(例如,\0 或\N,此时转义符为‘\’)。这些序列被理解为ASCII NUL(一个零值字节)和NULL。用于NULL 处理的规则在本节的后部进行说明。


IGNORE 1 LINES //忽略特定行数,CSV文件可以忽略掉第一行标题

LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。

如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:

LOAD DATA LOCAL INFILE 'dump.txt'
INTO TABLE mytbl (b, c, a);

一,在“load data infile”中:

先看看enclosed-by的作用:

 1,在字段值中存在"enclosed by"字符,并且其前一个字符为"escaped by"字符,则导入mysql后,"escaped by"字符会被去除。

 2,对于文本中被"enclosed by"包裹的字段值,如果值内出现连续两个的"enclosed by"字符,则导入后,会变成一个。

 

再看看escaped-by作用:

1,字段值内出现"escaped by"字符,该字符将被去除,同时保留其后一个字符;

2,但是对以下特殊的两个“挨着”字符会进行"反转义"处理

"\\0" -- 反转义成\0(0x00)

"\\b", "\\n", "\\r", "\\t" -- 反转义成\b, \n, \r, \t

"\\Z" -- 反转义成ascii码26

"\\N" -- 反转义成NULL

 

二,在“select into outfile”中:

还是先看看enclosed-by的作用:

1,enclosed-by字句的optionally是有作用的

有optionally,则只对字符串类型的字段使用encloed-by字符“包裹”;

无optionally,则对全部字段使用enclosed-by字符“包裹”。

 

最后看看escaped-by的作用:

1,对以下4中情况的字符进行转义

字段值中有"escaped by"字符

字段值中有"enclosed by"字符

字段值中有"fields terminated by"和"lines terminated by"字符串的首个字符

ascii码0 -> 转义之后变成两个字节

第一个字节 - '\\'

第二个字节 - '0'(字符0,而不是ascii 0)
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值