mysql导出包含列标题_关于csv:mysql +导入列标题中包含空格的文件+如何处理

本文介绍了在CSV文件导入MySQL时遇到列标题包含空格的处理方法,包括使用反引号转义标识符或者修改列标题。通过创建表时使用反引号包裹含空格的列名,例如`Rec Open Date`,可以成功创建表并使用LOAD DATA INFILE语句导入数据。
摘要由CSDN通过智能技术生成

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

我正在尝试使用加载数据内嵌,但首先必须创建表,这就是我的问题所在。

我尝试导入的文件.csv如下所示(但对于本例"rec open date",它只有1列):

"Rec Open Date",

"2015-10-06",

现在,我希望表中的列标题与csv文件相同,但我无法使用"or"来工作,如下面的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>

表皮生长因子2

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 ',';

mysql load data语句按位置而不是按名称从文件中加载值。

MySQL对字段的"名称"(来自.csv文件的标题行)没有任何要求,"匹配"任何列名称。(系统的其他组件可能有这种类型的需求,但MySQL加载数据没有。)

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

另外,我更喜欢在LOAD DATA语句中使用关键字FIELDS代替COLUMNS。

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

CREATE TABLE ...

...

`Rec Open Date` DATE NOT NULL COMMENT 'Rec Open Date',

^             ^

在我的键盘上,后退键是左上角`~的键,就在1的左边!密钥。

安西语录

如果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(明确地或包括在其他设置中),那么围绕标识符的双引号就不起作用。在标识符周围使用单引号是行不通的…单引号括住字符串文本。

要点:使用反勾字符来转义标识符(列名、表名等),并在字符串文本周围使用单引号。避免在字符串文本周围使用双引号,以使您的SQL代码即使在设置了ansi_引号的情况下也能工作。

tks,所以我可以jsut使用back ticks创建我的表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 ;

然后如何加载文件LOAD DATA LOCAL INFILE 'head_test_1col.csv' INTO TABLE test1234 COLUMNS TERMINATED BY ',';或这个LOAD DATA LOCAL INFILE 'head_test_1col.csv' INTO TABLE test1234不起作用,我的表中会得到所有的零

获取"所有零"听起来第一个字段不是有效的数值。如果字段值用双引号括起来。如果在LOAD DATA语句中包含"可选地用'"'括起来",则LOAD DATA可以删除双引号。MySQL要求日期字段采用YYYY-MM-DD格式。如果字段的格式不同,可以将字段加载到用户定义的变量中,例如@udv2,并使用set子句中的表达式将值转换为日期,例如`Rec Open Date` = STR_TO_DATE( @udv2, '%m/%d/%Y')。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值