1 Star 0 Fork 0

OceanBase / tutorials-doc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
5.4-4-how-to-export-data-from-a-mysql-table-to.md 4.04 KB
一键复制 编辑 原始数据 按行查看 历史
obdev 提交于 2023-02-21 02:34 . NOTE 样式排查

4.4 如何把 MySQL 表数据导出到 CSV 文件

CSV 文件简介

CSV 全称为 Comma Separate Values,这种文件格式经常被用来在不同程序之间做数据交互。

CSV 文件需满足以下要求:

  • 有固定行分隔符,以区分不同的行。通常行分隔符是换行符,但并不完全是这样。

  • 有固定列分隔符,以区分不同的列。默认列分隔符前后的空格会忽略。

  • 如果列的内容里出现行分隔符和列分隔符,则会做转义处理。否则不能正确识别列或者行。

下面用一个典型的例子来加深对 CSV 文件的印象。

create table t1(id bigint not null  auto_increment, c1 char(10), c2 varchar(10), primary key(id));
insert into t1 (c1, c2) values(' 中 国 ',' 中 国 ');
insert into t1 (c1, c2) values(' 中,国 ',' "中 国" ');
insert into t1 (c1, c2) values(' 中
国 ','中
国 ');
insert into t1 (c1, c2) values(' 中\\国 ',' "中\\国" ');

MariaDB [test]> select * from t1;
+----+----------+-------------+
| id | c1       | c2          |
+----+----------+-------------+
|  1 |      |         |
|  2 |  ,   |  "中 国"    |
|  3 |  
   | 
      |
|  4 |  中\国   |  "中\国"    |
+----+----------+-------------+
4 rows in set (0.00 sec)

MariaDB [test]> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
1 row in set (0.01 sec)

secure_file_priv 为空表示不限制导出导入,可以修改 MySQL 的启动参数文件(默认是 /etc/my.cnf),添加 secure_file_priv=/tmp 。然后重启 MySQL。

MariaDB [test]> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | /tmp/ |
+------------------+-------+
1 row in set (0.00 sec)

MariaDB [test]> select * from t1 into outfile '/tmp/t1.csv' fields terminated by ',' enclosed by '"' lines terminated by '\n' ;
Query OK, 3 rows affected (0.00 sec)

如果不指定 FIELDS 或 LINES,缺省值为:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''

查看导出文件 /tmp/t1.csv

说明

通常在目录 /tmp 下能找到文件,但是个别比较老的系统,如在使用 systemd 的 CentOS 里的 Mariadb 5.5 环境下,根据该目录找不到文件。文件实际在目录 /tmp/systemd-private-55b199ca1f6f42dfad8bfa065113e790-mariadb.service-EFJMNX/tmp/ 下。

#cat -n tmp/t1.csv
     1  "1"," 中 国"," 中 国 "
     2  "2"," 中,国"," \"中 国\" "
     3  "3"," 中\
4  国","中 \
5  国 "
     6  "4"," 中\\国"," \"\\\" "

从导出文件可以看出,字段的值由双引号封装,因此字段内的分隔符无影响。但是字段内如果包含双引号,将被默认转义,转义引导符是默认的 \ 。字段内的换行符亦无影响。

将此文件导入 MySQL。

MariaDB [test]> create table t2 like t1;
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> load data infile '/tmp/t1.csv' into table t2 fields terminated by ',' enclosed by '"' lines terminated by '\n' ;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [test]> select * from t2;
+----+----------+-------------+
| id | c1       | c2          |
+----+----------+-------------+
|  1 |      |         |
|  2 |  ,   |  "中 国"    |
|  3 |  
   | 
      |
|  4 |  中\国   |  "中\国"    |
+----+----------+-------------+
4 rows in set (0.00 sec)

MySQL 的 SELECT INTO OUTFILELOAD DATA 还有很多高级用法,此处不详细列出。 建议导出和导入使用选项 fields terminated by ',' enclosed by '"' lines terminated by '\n',可满足日常需求。

使用此方式导出的 CSV 文件,能导入 MySQL,同时也能导入 OceanBase MySQL。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/oceanbase/tutorials-doc.git
git@gitee.com:oceanbase/tutorials-doc.git
oceanbase
tutorials-doc
tutorials-doc
V1.0.0

搜索帮助

344bd9b3 5694891 D2dac590 5694891