# 13.4 表的导出和导入

## 13.4.1 使用`SELECT ... INTO OUTFILE`导出文本文件

```sql
SELECT columnlist FROM table WHERE condition INTO OUTFILE 'filename' [OPTIONS]
```

> 备注：结果返回一个或多个符合条件的记录，导出到一个名为filename的文件中，前提是这个名字的文件不存在
>
> 备注2：`OPTIONS`可选项：
>
> ​ `FIELDS TERMINATED BY 'value'`：设置字段之间的分隔字符，可以是单个或多个，默认`\t`
>
> ​ `FIELDS [OPTIONALLY] ENCLOSED BY 'value'`：设置字段的包围字符，只能为单个字符；如果启用了`OPTIONALLY`，则只有CHAR和VARCHAR这类字符数据字段被包括
>
> ​ `FIELDS ESCAPED BY 'value'`：设置如何写入或读取特殊字符，只能为单个字符，即设置转义字符，默认值'\\'
>
> ​ `LINES STARTING BY 'value'`：设置每行数据的开头字符，可以为单个或多个字符，默认情况下不使用任何字符
>
> ​ `LINES TERMINATED BY 'value'`：设置每行数据的结尾字符，可以为单个或多个字符，默认`\n`
>
> 注意：`FITLDS`与`LINES`都是自选添加，如果都有，`FITLDS`再前，`LINES`在后

```sql
SELECT * FROM test INTO OUTFILE "E:\rest.txt"
```

## 13.4.2 使用`MySQLdump`命令导出文本文件

```sql
mysqldump -T path -u root -p dbname [tables] [OPTIONS]
```

> 备注：-T表示导出纯文本文件，path表示导出数据的目录，tables为指定要导出的表名，不指定查询所有表的数据
>
> 备注2：`OPTIONS`可选项：
>
> ​ `--fields-terminated-by=value`：设置字段之间的分割字符，可以为单个或多个字符，默认`\t`
>
> ​ `--fields-enclosed-by=value`：设置字段的包围字符
>
> ​ `--fields-optionally-enclosed-by=value`：设置字段的包围字符，只能为单个字符；只有CHAR和VARCHAR这类字符数据字段被包括
>
> ​ `--fields-escaped-by=value`：控制如何写入或读取特殊字符，只能为单个字符，即设置转义字符，默认`\`
>
> ​ `--lines-terminated-by=value`：设置每行数据结尾的字符，可以为单个字符或多个字符，默认`\n`

```sql
mysqldump -T E:\test peron -u root -p
```

## 13.4.3 使用MySQL命令导出文本文件

语法：

```sql
mysql -u root -p --exexute="SELECT语句" dbname > filename.txt
```

举例：

```sql
mysql -u root -p --exexute="SELECT * FROM tab" test > E:\filename.txt
```

显示结果：

```sql
mysql -u root -p --vertical --exexute="SELECT * FROM tab" test > E:\filename.txt
```

转出到html：

```sql
mysql -u root -p --html --exexute="SELECT * FROM tab" test > E:\filename.html
```

转出到xml：

```sql
mysql -u root -p --xml --exexute="SELECT * FROM tab" test > E:\filename.xml
```

## 13.4.4 使用`LOAD DATA INFILE`方式导入文本文件

```sql
LOAD DATA INFILE 'filename.txt' INTO TABLE tablename [OPTIONS] [IGNORE number LINES]
```

> 备注：filename.txt表示来源，tablename表示导入的数据表名
>
> 备注2：`OPTIONS`可选项：
>
> ​ `FIELDS TERMINATED BY 'value'`：设置字段之间的分隔字符，可以是单个或多个，默认`\t`
>
> ​ `FIELDS [OPTIONALLY] ENCLOSED BY 'value'`：设置字段的包围字符，只能为单个字符；如果启用了`OPTIONALLY`，则只有CHAR和VARCHAR这类字符数据字段被包括
>
> ​ `FIELDS ESCAPED BY 'value'`：设置如何写入或读取特殊字符，只能为单个字符，即设置转义字符，默认值'\\'
>
> ​ `LINES STARTING BY 'value'`：设置每行数据的开头字符，可以为单个或多个字符，默认情况下不使用任何字符
>
> ​ `LINES TERMINATED BY 'value'`：设置每行数据的结尾字符，可以为单个或多个字符，默认`\n`
>
> 备注3：`IGNORE number LINES`表示忽略文件开始处的函数，number表示忽略的行数，执行需要`FILE`权限

```sql
LOAD DATA INFILE 'E:\test.txt' INTO TABLE db.test
```

## 13.4.5 使用`MySQLimport`命令导入文本文件

```sql
mysqlimport -u root -p dbname filename.txt [OPTIONS]
```

> 备注：dbname为导入表所在数据库名
>
> 备注2：`OPTIONS`可选项：
>
> `--fields-terminated-by=value`：设置字段之间的分割字符，可以为单个或多个字符，默认`\t`
>
> ​ `--fields-enclosed-by=value`：设置字段的包围字符
>
> ​ `--fields-optionally-enclosed-by=value`：设置字段的包围字符，只能为单个字符；只有CHAR和VARCHAR这类字符数据字段被包括
>
> ​ `--fields-escaped-by=value`：控制如何写入或读取特殊字符，只能为单个字符，即设置转义字符，默认`\`
>
> ​ `--lines-terminated-by=value`：设置每行数据结尾的字符，可以为单个字符或多个字符，默认`\n`
>
> ​ `--ignore-lines=n`：忽视数据文件的前n行
>
> 备注3：其他选项：
>
> ​ `--columns=column_list, -c column_list`：该选项采用逗号分隔的列名作为其值。列名的顺序指示如何匹配数据文件列和表列
>
> ​ `--compress, -C`：压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)
>
> ​ `-d, --delete`：导入文件前清空表
>
> ​ `--force， -f`：忽视错误
>
> ​ `--host=host_name， -h host_name`：将数据导入给定主机上的MySQL服务器，默认localhost
>
> ​ `--ignore，-i`：参见`--replace`选项描述
>
> ​ `--ignore-lines=n`：忽视数据文件的前n行
>
> ​ `--local， -L`：从本地客户端读取输入文件
>
> ​ `--lock-tables，-l`：处理文本文件前锁定所有表以便写入
>
> ​ `--password[=password], -p[password]`：连接服务器时使用密码
>
> ​ `--port=port_num，-P port_num`：用于连接TCP/IP的端口号
>
> ​ `--protocol={TCP|SOCKET|PIPE|MEMORY}`：使用的连接协议
>
> ​ `--replace, -r`：和`-i`选项控制复制唯一键值已有记录的输入记录的处理，-r是替换，-i是跳过，不指定，报错并退出
>
> ​ `--silent, -s`：沉默模式，只有错误才输出信息
>
> ​ `--user=user_name, -u user_name`：当连接服务器时候MySQL使用的用户名
>
> ​ `--verbose -v`：冗长模式，打印详细操作信息
>
> ​ `--version -V`：显示版本信息并退出
