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

时间:2016-04-13 23:43:29

标签: mysql csv

我有一个csv文件,我想将其导入到mysql中,我正慢慢地到达那里。

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

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

"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之后,创建表我将执行以下操作,但文件中的列标题必须与数据表中的列标题相同,正如我所理解的那样。

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE test1234 COLUMNS TERMINATED BY ',';

1 个答案:

答案 0 :(得分:0)

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的左边! key。

<强> ANSI_QUOTES

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

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代码工作。