暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

实战教程第四章4.4:如何把 MySQL 表数据导出到 CSV 文件

首先需要了解一下 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。(通常在这个目录能找到文件,个别比较老的系统,使用 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 OUTFILE 和 LOAD DATA 还有很多高级用法,这个太过复杂,这里就不研究了。通常建议导出和导入使用选项 fields terminated by ',' enclosed by '"' lines terminated by '\n' 就可以满足常用需求。至少这样导出的 CSV 文件,能在 MySQL 里导入,那么也应该能在 OceanBase MySQL 里导入,不管是使用哪种方法。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论