mysql csv导入导出_MySQL 导入导出 CSV 文件

本文详细介绍了如何使用MySQL的LOAD DATA INFILE和SELECT INTO OUTFILE命令进行CSV文件的导入和导出,包括相关参数的设置,如字段和行分隔符。同时,文章提到了Windows与Linux平台的差异,如换行符和BOM头的问题,并提供了相应的解决办法。此外,还讨论了数据导入时可能出现的问题,如双引号引起的异常数据,以及如何处理这些问题。
摘要由CSDN通过智能技术生成

导入

示例:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

常用参数:

FIELDS TERMINATED BY ',':指定字段分隔符

OPTIONALLY ENCLOSED BY '"':认为双引号中的是一个独立的字段。Excel 转 CSV 时,有特殊字符(逗号、顿号等)的字段,会自动用双引号引起来

LINES TERMINATED BY '\n':指定行分隔符,注意,在 Windows 平台上创建的文件,分隔符是 '\r\n'

导出

SELECT … INTO 语法可以将查询结果保存到变量或文件中:

SELECT ... INTO var_list # 将字段的值保存到变量中

SELECT ... INTO OUTFILE # 将选中的行保存到文件中。可以指定列和行的结束符,以生成指定格式的文件。

SELECT ... INTO DUMPFILE # 将一个单独的行写入文件中,没有格式

示例:

mysql > SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

LINES TERMINATED BY '\n'

FROM test_table;

mysql> SELECT * INTO OUTFILE '/var/lib/mysql-files/1.txt'

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

LINES TERMINATED BY '\n'

FROM professions;

Query OK, 2220 rows affected (0.04 sec)

常用参数(跟 LOAD DATA INFILE 语法一样):

FIELDS TERMINATED BY ',':指定字段分隔符

OPTIONALLY ENCLOSED BY '"':认为双引号中的是一个独立的字段。Excel 转 CSV 时,有特殊字符(逗号、顿号等)的字段,会自动用双引号引起来

LINES TERMINATED BY '\n':指定行分隔符,注意,在 Windows 平台上创建的文件,分隔符是 '\r\n'

清空表中的所有数据

操作失误时,需要简单的方式清空表,有两种方式:不带 where 参数的 delete 语句,或 truncate。

delete from my_table;

truncate table my_table;

truncate 相当于使用表的结构重新创建表,所有的状态都相当于新表。

不带 where 参数的 delete 则是将表中所有记录一条一条删除。

truncate 比 delete 快,但 truncate 删除后不记录日志,数据无法恢复。

注意事项

Windows 中用 Excel 导出的 CSV 文件,采用 UTF-8-BOM 编码,换行符是 CRLF 回车换行。但是在 Linux 中不支持 UTF-8-BOM 编码,需要手动转为 UTF-8 编码。如果换行符用 CRLF 回车换行,则需要在 LOAD DATA INFILE 命令中通过 LINES TERMINATED BY '\r\n' 明确指定换行符:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

如果已经转为 LF 换行了,则可以省略这一句。

823e679e4f53be93406435cd2f01599d.png

常见问题

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

这一般是因为,你上传或下载的文件没有在 MySQL 指定的安全目录中。默认情况下,MySQL 导入导出文件时,只能使用安全目录。使用下面的命令查看 MySQL 的安全目录:

mysql> SHOW VARIABLES LIKE "secure_file_priv";

+--------------------------+-----------------------+

| Variable_name | Value |

+--------------------------+-----------------------+

| require_secure_transport | OFF |

| secure_auth | ON |

| secure_file_priv | /var/lib/mysql-files/ |

+--------------------------+-----------------------+

3 rows in set (0.00 sec)

解决方案有两个:

将文件复制到 secure_file_priv 指定的安全目录。推荐。

在 /etc/my.cnf 配置文件(Windows 平台下是 my.ini)中关闭 secure_file_priv。这个选项无法动态配置,修改后必须重启。

对于第一个方案,复制文件到安全目录后,需要使用完整路径:

mysql> load data infile '/var/lib/mysql-files/profession.csv' into table professionss fields terminated by ',' lines terminated by '\n';

数据中的第一个字段始终报错

如果是整数,则报错如下:

ERROR 1366 (HY000): Incorrect integer value: '1800' for column 'CompanyID' at row 1

Windows 平台下创建的文件基本上都使用了 BOM 头,即在文件的头部添加描述性信息,可以参考 这里。这会在 Linux 平台下导致致命错误,去掉这个 BOM 头就好了。

Excel 另存为 CSV 文件后,默认编码是“使用 UTF-8 BOM 编码”,在 Notepad++ 中打开文件,选择“使用 UTF-8 编码”保存即可清除 BOM 头:

fa660581140a980c3389b8f10a46dacd.png

部分数据保存失败,且有异常数据

数据中出现了双引号,且部分数据插入失败,并插入了部分异常数据:

244015fb4010cf280ea7ae1a07fccd48.png

Excel 另存为 CSV 文件后,对于特殊字符(逗号、顿号等)的字段,会自动用双引号引起来。但是添加的双引号的位置竟然会出错:

1800,1,3,2021304,202,"计算机系统分析技术人员

",1

1800,1,3,2021305,202,"维护工程师

",2

1800,1,3,2021306,202,"销售工程师

",1

可以看到,好多行发生了不应该的换行。两个解决方案:

使用 OPTIONALLY ENCLOSED BY '"' 自动处理,推荐:

mysql> LOAD DATA INFILE '/var/lib/mysql-files/profession.csv' INTO TABLE professionss FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';

Query OK, 2220 rows affected (0.06 sec)

Records: 2220 Deleted: 0 Skipped: 0 Warnings: 0

通过正则批量替换将 \n", 替换为 , 使表格数据没有问题:

mysql> LOAD DATA INFILE '/var/lib/mysql-files/profession.csv' INTO TABLE professionss FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

Query OK, 2220 rows affected (0.06 sec)

Records: 2220 Deleted: 0 Skipped: 0 Warnings: 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值