首先需要了解一下 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 里导入,不管是使用哪种方法。
附录:
- 4.1 OceanBase 的 MySQL 兼容性简介
- 4.2 如何使用 mysqldump 迁移 MySQL 表 OceanBase
- 4.3 如何使用 dbcat 迁移 MySQL 表结构到 OceanBase
- 4.4 如何把 MySQL 表数据导出到 CSV 文件
- 4.5 如何使用 OceanBase 的 LOAD 命令加载 csv 数据文件 OceanBase
- 4.6 如何使用 DataX 加载 CSV 数据文件到 OceanBase
- 4.7 如何使用 DATAX 迁移 MySQL数据到 OceanBase
- 4.8 如何使用 OBDUMPER / OBLOADER 工具导出/导入 OceanBase 数据
- 4.9 如何使用 DATAX 迁移 OceanBase 数据到 MySQL/ORACLE
- 4.10 如何使用 CANAL 将 MySQL 数据实时同步到 OceanBase
结束语
加入教程直播群方式一:钉钉群号3255 4020
加入教程直播群方式二:扫码下方二维码加入