mysql + 导入列标题中有空格的文件 + 如何处理

标签 mysql csv

我有一个 csv 文件,我想将其导入到 mysql 中,我正在慢慢地实现它。

我正在尝试使用 LOAD DATA INFILE但首先我必须创建表格,这就是我的问题所在。

我尝试导入的 file.csv 看起来像这样(但对于此示例“Rec Open Date”只有 1 列):

"Rec Open Date", <other columns e.g. "Data Volume (Bytes)">
"2015-10-06", <other values>

现在我希望表中的列标题与 csv 文件相同,但我无法使用 ' 或 "使其工作,如下所示 EG1 和 EG2。 我可以让它工作的方法是将表标题中的空格替换为下划线,即“Rec Open Date”变为“Rec_Open_Date”。但这将涉及更改 csv 文件中的列标题名称,即将表标题中的空格替换为下划线。这对我来说似乎是最好的选择,但有人能提供其他明智的建议吗?理想情况下,我希望 csv 文件列标题与数据表标题相同,而 EG3 似乎是实现此目的的方法。

EG1:

mysql> CREATE TABLE IF NOT EXISTS test1234 (
    ->   id int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
    ->   'Rec Open Date' Date NOT NULL COMMENT 'Rec Open Date',
    ->   PRIMARY KEY (id)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='datatable demo table' AUTO_INCREMENT=64 ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Rec Open Date' Date NOT NULL COMMENT 'Rec Open Date',
  PRIMARY KEY (id)
) ENGI' at line 3
mysql>

EG2

mysql> ^MCREATE TABLE IF NOT EXISTS test1234 (
    ->   id int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
    ->   "Rec Open Date" Date NOT NULL COMMENT 'Rec Open Date',
    ->   PRIMARY KEY (id)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='datatable demo table' AUTO_INCREMENT=64 ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"Rec Open Date" Date NOT NULL COMMENT 'Rec Open Date',
  PRIMARY KEY (id)
) ENGI' at line 3
mysql>

EG3:

mysql> CREATE TABLE IF NOT EXISTS test1234 (
    ->   id int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
    ->   Rec_Open_Date Date NOT NULL COMMENT 'Rec Open Date',
    ->   PRIMARY KEY (id)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='datatable demo table' AUTO_INCREMENT=64 ;
Query OK, 0 rows affected (0.00 sec)

mysql>

注意 按照 EG3,创建表格,然后我将执行以下操作,但据我所知,文件中的列标题必须与数据表上的列标题相同。

将数据本地内文件“file.csv”加载到表 test1234 以“,”结尾的列;

最佳答案

MySQL LOAD DATA 语句按位置从文件中加载值,而不是按名称。

MySQL 对于字段的“名称”(来自 .csv 文件中的标题行)没有任何“匹配”任何列名称的要求。 (系统的某些其他组件可能有这种类型的要求,但 MySQL LOAD DATA 没有。)

.csv 文件没有标题行是有效的。当有标题行时,我们通常使用IGNORE 1 LINES“跳过”它。

顺便说一句,我更喜欢在 LOAD DATA 语句中使用关键字 FIELDS 来代替 COLUMNS

<小时/>

在 MySQL 中,标识符(列名、表名)可以使用反引号字符进行转义。要使用包含无效字符(例如空格)的标识符,必须对标识符进行转义。

CREATE TABLE ... 
... 
`Rec Open Date` DATE NOT NULL COMMENT 'Rec Open Date',
^             ^

在我的键盘上,反引号是左上角 ` ~ 的键,位于 1 左侧! 键。

<小时/>

ANSI_QUOTES

如果sql_mode变量包含ANSI_QUOTES,那么您还可以使用双引号来转义标识符。例如

SHOW VARIABLES LIKE 'sql_mode' ;

SET sql_mode = 'ANSI_QUOTES,...' ;

SHOW VARIABLES LIKE 'sql_mode'

Variable_name  Value        
-------------  -----------
sql_mode       ANSI_QUOTES  

然后:

CREATE TABLE ... 
... 
"Rec Open Date" DATE NOT NULL COMMENT 'Rec Open Date',
^             ^

如果sql_mode包含ANSI_QUOTES(显式或包含在其他设置中),则标识符周围的双引号不会工作。并且在标识符周围使用单引号是行不通的...单引号将字符串文字括起来。

<小时/>

要点:使用反引号字符来转义标识符(列名、表名等)并在字符串文字两边使用单引号。避免在字符串文字两边使用双引号,这样即使设置了 ANSI_QUOTES,SQL 代码也能正常工作。

关于mysql + 导入列标题中有空格的文件 + 如何处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611416/

相关文章:

php - "Read More"按钮在 PHP、MySQL CMS 中停止工作

java - 使用 jdbc 的 SQL 语法错误

mysql - SQL = SUM 总计

java - 在MySQL中根据条件检索数据

csv - 去 panic : extra delimiter at end of line

C读取csv文件

excel - 如何通过 VBA 将一个月的 csv 文件(命名日期)导入 Excel?

PHP MySQL 查询生成器

mysql - 将 CSV 导入 Azure 表存储问题

python - 使用 CSV 文件的最小学习曲线语言