📜  MySQL将表导出为CSV

📅  最后修改于: 2020-11-19 00:45:12             🧑  作者: Mango

MySQL导出表到CSV

MySQL具有将表导出到CSV文件的功能。 CSV文件格式是逗号分隔的值,我们可以使用它在各种应用程序(例如Microsoft Excel,Goole Docs和Open Office)之间交换数据。以CSV文件格式存储MySQL数据非常有用,它使我们能够以所需的方式对其进行分析和格式化。这是一个纯文本文件,可帮助我们非常轻松地导出数据。

MySQL提供了一种简单的方法来将任何表导出到驻留在数据库服务器中的CSV文件中。在导出MySQL数据之前,我们必须确保以下几点:

  • MySQL服务器的进程具有对指定(目标)文件夹的读/写访问权限,该文件夹包含CSV文件。
  • 系统中不存在指定的CSV文件。

要将表导出到CSV文件,我们将使用SELECT INTO …. OUTFILE语句。该语句是LOAD DATA命令的补充,该命令用于从表写入数据,然后将其导出为服务器主机上的指定文件格式。这是为了确保我们具有使用此语法的文件特权。

SELECT column_lists
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/filename.csv'   
FIELDS TERMINATED BY ','  
OPTIONALLY ENCLOSED BY '"'  
LINES TERMINATED BY '\r\n';  

我们还可以将此语法与values语句一起使用,以将数据直接导出到文件中。以下语句对其进行了更清晰的说明:

SELECT * FROM (VALUES ROW(1,2,3,4),ROW(5,6),ROW(7,8)) AS table1
    INTO OUTFILE '/tmp/selected_values.txt';

如果要导出所有表列,则将使用以下语法。使用此语句,行的顺序和数量将由ORDER BY和LIMIT子句控制。

TABLE table_name ORDER BY lname LIMIT 1000
INTO OUTFILE '/path/filename.txt'
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';;

从上面

以','结尾的行:用于指示文件中由逗号运算符终止的行的行。每行包含文件中每一列的数据。

FIELDS ENCLOSED BY'“':用于指定文件中用双引号引起来的字段。它防止包含逗号分隔符的值。如果双引号中包含的值,则不会将逗号识别为分隔符。

导出文件的存储位置

MySQL中每个导出文件的存储位置都存储在默认变量secure_file_priv中。我们可以执行以下命令来获取导出文件的默认路径。

mysql> SHOW VARIABLES LIKE "secure_file_priv";

执行后,它将给出如下结果,在此我们可以看到以下路径:C:/ ProgramData / MySQL / MySQL Server 8.0 / Uploads /作为默认文件位置。运行导出命令时将使用此路径。

如果要更改secure_file_priv变量中指定的CSV文件的默认导出位置,则需要编辑my.ini配置文件。在Windows平台上,此文件位于以下路径:C:\ ProgramData \ MySQL \ MySQL Server XY

如果要导出MySQL数据,首先,需要创建一个至少包含一个表的数据库。我们将以该表为例。

我们可以通过在正在使用的编辑器中执行以下代码来创建数据库和表:

CREATE DATABASE testdb;
USE testdb;

CREATE TABLE employee_detail (
  ID int NOT NULL AUTO_INCREMENT,
  Name varchar(45) DEFAULT NULL,
  Email varchar(45) DEFAULT NULL,
  Phone varchar(15) DEFAULT NULL,
  City varchar(25) DEFAULT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY unique_email (Email),
  UNIQUE KEY index_name_phone (Name,Phone)
)

INSERT INTO employee_detail ( Id, Name, Email, Phone, City)   
VALUES (1, 'Peter', 'peter@javatpoint.com', '49562959223', 'Texas'),   
(2, 'Suzi', 'suzi@javatpoint.com', '70679834522', 'California'),   
(3, 'Joseph', 'joseph@javatpoint.com', '09896765374', 'Alaska'),  
(4, 'Alex', 'alex@javatpoint.com', '97335737548', 'Los Angeles'),  
(5, 'Mark', 'mark@javatpoint.com', '78765645643', 'Washington'),  
(6, 'Stephen', 'stephen@javatpoint.com', '986345793248', 'New York');  

如果执行SELECT语句,将看到以下输出:

使用SELECT INTO … OUTFILE语句以CSV格式导出MySQL数据

要将表数据导出到CSV文件,我们需要执行以下查询:

SELECT Id, Name, Email, Phone, City FROM employee_detail
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/employee_backup.csv' 
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

我们将获得以下输出,可以看到六行受到影响。这是因为指定的表仅包含六行。

如果我们再次执行同一条语句,MySQL将产生一条错误消息,可以在以下输出中看到:

错误消息告诉我们指定的文件名已经存在于指定的位置。因此,如果我们导出具有相同名称和位置的新CSV文件,则无法创建该文件。我们可以解决此问题,或者删除指定位置上的现有文件,或者重命名文件名以在同一位置创建它。

我们可以通过导航到给定路径来验证是否在指定位置创建了CSV文件,如下所示:

当我们打开该文件时,它将如下图所示:

在图像中,我们可以看到数字字段用引号引起来。我们可以通过在ENCLOSED BY之前添加OPTIONALLY子句来更改此样式:

SELECT Id, Name, Email, Phone, City FROM employee_detail
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/employee_backup.csv' 
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n';

使用列标题导出数据

有时我们希望将数据与列标题一起导出,以使文件更方便。如果CSV文件的第一行包含列标题,则导出的文件更容易理解。我们可以使用UNION ALL语句添加列标题,如下所示:

SELECT 'Id', 'Name', 'Email', 'Phone', 'City'
UNION ALL
SELECT Id, Name, Email, Phone, City FROM employee_detail
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/employee_backup.csv' 
FIELDS TERMINATED BY ';'
ENCLOSED BY '"' 
ESCAPED BY '"'
LINES TERMINATED BY '\r\n';

在此查询中,我们可以看到我们为每个列名称添加了标题。我们可以通过导航到指定的URL来验证输出,其中第一行包含每一列的标题:

以CSV格式导出MySQL表

MySQL OUTFILE还允许我们导出表而无需指定任何列名。我们可以使用以下语法以CSV文件格式导出表:

TABLE employee_detail ORDER BY City LIMIT 1000
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/employee_backup.csv'
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

如果执行上面的语句,我们的命令行工具将产生以下结果。这意味着指定的表包含六行,这些行已导出到employee_backup.csv文件中。

处理空值

有时结果集中的字段具有NULL值,则目标文件(导出的文件类型)将包含N而不是NULL。我们可以通过使用IFNULL函数将NULL值替换为“不适用(N / A)”来解决此问题。下面的语句更清楚地说明了这一点:

SELECT Name, Email, Phone, IFNULL(Phone, 'N/A') FROM employee_detail
INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/employee_backup.csv' 
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

使用MySQL Workbench将表导出为CSV格式

如果我们不想访问数据库服务器以导出CSV文件,则MySQL提供了另一种方法,即使用MySQL Workbench。 Workbench是一个无需使用命令行工具即可使用MySQL数据库的GUI工具。它允许我们在本地系统中将语句的结果集导出为CSV格式。为此,我们需要执行以下步骤:

  • 运行语句/查询并获取其结果集。
  • 然后,在结果面板中,单击“将记录集导出到外部文件”选项。记录集用于结果集。
  • 最后,将显示一个新对话框。在这里,我们需要提供文件名及其格式。填写详细信息后,单击“保存”按钮。下图更清楚地说明了这一点:

现在,我们可以通过导航到指定路径来验证结果。