我正在从第一列的 CSV 文件中获取 MySQL 中导入的所有数据。所有其他列都获得 NULL 值

I am getting all data imported in MySQL from CSV file in the first column. All other columns gets NULL values

我正在 Mac 本地使用 MySQL。 我有一个 CSV 文件,所有字段都用双引号括起来。 这是我的 CSV 文件第一行的摘录:

$ head -5 companies.csv
"COMPANY_ADDRESS1","COMPANY_ADDRESS2","COMPANY_CITY","COMPANY_COUNTRY","COMPANY_FAX","COMPANY_GERMANY","COMPANY_ID","COMPANY_INDIANAPOLIS","COMPANY_NAME","COMPANY_STATE","COMPANY_TELEPHONE","COMPANY_VAT","COMPANY_ZIP"
"980 Madison Avenue","6th Floor","New York","USA","","","1393","","Lucky Fives LLC","NY","212-74-2313","","10075"
"1209 Orange Street","","Wilmington","USA","","","1394","","Global Five Holdings","DE","-","","19801"
"2020 Ponce de Leon Boulevard","PH2","Coral Gables","USA","","1015110","1395","","Lion Aero Corporation","FL","305-755-5120","","33134"
"100 NE Adams Street","","Peoria","USA","","","1396","","Caterpillar Inc.","IL","+13096755975","","61630"

这是我的导入命令:

$ mysqlimport --local --ignore-lines=1 my_db companies.csv -u root --fields-enclosed-by='\"' --lines-terminated-by='\r\n' --fields-terminated-by=','

我正在导入所有记录,没有跳过任何内容:

companies: Records: 3063  Deleted: 0  Skipped: 0  Warnings: 104

但是,为什么我在第一列中导入了所有数据,而所有其他列都填充了 NULL?

table 之前已创建,其中包含支持要加载的数据所需的所有列。

我认为 mysqlimport 正在寻找一个反斜杠双引号来括起字段,但没有找到,所以它是一个字段。

我质疑双引号前反斜杠字符的用途。如果这是 Linux bash shell,我认为不需要反斜杠来指定双引号。作为演示:

# echo foo --fields-enclosed-by='\"'
foo --fields-enclosed-by=\"

# echo foo --fields-enclosed-by='"'
foo --fields-enclosed-by="

(这只是一个猜测,我可能是错的。我之前错了很多次。mysqlimport 可能会丢弃传递给它的反斜杠字符。问题可能出在其他方面。但是对于一个测试,我会在没有反斜杠的情况下旋转它,看看没有它它能产生多大的烟球。)

演示环境:

# uname -o -r -s
Linux 3.13.0-83-generic GNU/Linux

# echo $SHELL
/bin/bash

测试架构:

-- drop table if exists aT;
create table aT
(   -- address thing
    COMPANY_ADDRESS1 varchar(100) not null,
    COMPANY_ADDRESS2 varchar(100) not null,
    COMPANY_CITY varchar(100) not null,
    COMPANY_COUNTRY varchar(100) not null,
    COMPANY_FAX varchar(100) not null,
    COMPANY_GERMANY varchar(100) not null,
    COMPANY_ID varchar(100) not null,
    COMPANY_INDIANAPOLIS varchar(100) not null,
    COMPANY_NAME varchar(100) not null,
    COMPANY_STATE varchar(100) not null,
    COMPANY_TELEPHONE varchar(100) not null,
    COMPANY_VAT varchar(100) not null,
    COMPANY_ZIP varchar(100) not null
);

交互式或通过程序命令 运行:

LOAD DATA INFILE 'c:\nate\aT.csv' INTO TABLE aT
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 1 LINES;
select * from aT;

or Linux:

LOAD DATA INFILE '/home/nate/aT.csv' INTO TABLE aT
  FIELDS TERMINATED BY ',' ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  IGNORE 1 LINES;

导入数据没问题

select * 来自 aT; -- 查看导入

现在用于命令行(创建上述之一的 .sql):

truncate aT; -- run this first

mysql -u root -p so_gibberish2 < c:\nate\run_this1.sql

so_gibberish2 是数据库名称。数据进来了。因为 mysql 客户端不受 bash 或其他命令行转义序列的约束。