在这里提供了两个使用 .csv 格式 的简单的 MySQL 数据库的导数据工具。csv 格式可以很容易地生成和解析,而且,也可以很容易地使用办公软件把 .csv 格式转换为 .xls/.xlsx 格式,或者把 .xls/.xlsx 格式转换为 .csv 格式的文件。
在编译代码之前,如果你用的是 yum,那么请先确定软件包 mysql-devel
已经安装在你的系统中,才能使用 mysql 的头文件 mysql/mysql.h
,以及和库文件 libmysqlclient.a
或者 libmysqlclient.so
。
使用下面的两行命令一编译这两个工具:
g++ mysql2csv.cpp -omysql2csv -g -L/usr/lib64/mysql/ -lmysqlclient
g++ csv2mysql.cpp -ocsv2mysql -g -L/usr/lib64/mysql/ -lmysqlclient
首先,创建一个测试用的数据库,建立初始的数据:
[roxma@VM_6_207_centos mysql2csv]$ mysql -uroot --password="" --default-character-set=utf8
...
mysql> create database csv_test default charset=utf8;
Query OK, 1 row affected (0.02 sec)
mysql> use csv_test;
Database changed
mysql> create table test(id int primary key, value1 varchar(1024))engine=innodb;
Query OK, 0 rows affected (0.08 sec)
mysql> show create table test \G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) NOT NULL,
`value1` varchar(1024) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into test (id,value1) values(1,"hello"),(2, 'comma , double quotes " '),(3,NULL);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+----+--------------------------+
| id | value1 |
+----+--------------------------+
| 1 | hello |
| 2 | comma , double quotes " |
| 3 | NULL |
+----+--------------------------+
3 rows in set (0.00 sec)
导出 MySQL 的数据到 .csv 文件:
[roxma@VM_6_207_centos mysql2csv]$ ./mysql2csv host="127.0.0.1" port="3306" db="csv_test" user="root" passwd="" charset="utf8" execute="select * from test" > data.csv
host=127.0.0.1
port=3306
db=csv_test
user=root
passwd=
charset=utf8
execute=select * from test
[roxma@VM_6_207_centos mysql2csv]$ cat data.csv
id,value1
1,hello
2,"comma , double quotes "" "
3,NULL
导入 .csv 文件的数据到 MySQL:
[roxma@VM_6_207_centos mysql2csv]$ ./csv2mysql host="127.0.0.1" port="3306" db="csv_test" user="root" passwd="" charset="utf8" execute="insert into test set id=?id+3, value1=?value1" input="data.csv"
host=127.0.0.1
port=3306
db=csv_test
user=root
passwd=
charset=utf8
execute=insert into test set id=?id+3, value1=?value1
input=data.csv
3 rows executed.
[roxma@VM_6_207_centos mysql2csv]$ mysql -uroot --password="" --default-character-set=utf8 --database="csv_test" -e"select * from test"
+----+--------------------------+
| id | value1 |
+----+--------------------------+
| 1 | hello |
| 2 | comma , double quotes " |
| 3 | NULL |
| 4 | hello |
| 5 | comma , double quotes " |
| 6 | NULL |
+----+--------------------------+
选项 | 描述 | 默认值 |
---|---|---|
通用选项 | ||
host | MySQL server 的机器名 | 127.0.0.1 |
port | MySQL 连接的目标端口 | 3306 |
user | MySQL 用户名 | root |
passwd | MySQL 用户的密码 | |
charset | MySQL 连续使用的字符编码 | utf8 |
db | 使用的 MySQL 数据库名。相当于 use db 命令。 | |
mysql2csv 选项 | ||
execute | 需要执行的 MySQL 查询命令 | |
null_cell_value | 当对应的值NULL时,使用这个字符串替换到表格中。 | NULL |
output | 生成的 csv 文件的文件名。如果这个选项为空,则文件 的内容会被输出到 stdout。 | |
csv2mysql 选项 | ||
execute | 需要执行的 MySQL 指令 | |
warning_as_error | 如果为个选项为1,那么在执行 MySQL 语句的过程中如果出现任何 warning,都会被视为错误,程序直接终止退出。 | 1 |
input | 输入的 csv 文件的文件名。如果这个选项为空,则程序从 stdin 中读取数据。 |
https://github.com/roxma/cpp_learn/tree/master/tools/mysql2csv