【问题标题】:I am getting all data imported in MySQL from CSV file in the first column. All other columns gets NULL values我正在从第一列的 CSV 文件中导入 MySQL 中的所有数据。所有其他列都获得 NULL 值
【发布时间】:2016-06-20 19:26:02
【问题描述】:

我是在我的 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?

之前创建的表包含支持要加载的数据所需的所有列。

【问题讨论】:

  • MySQL 不需要转义的双引号 \" 并且它已经被 shell 转义了,因为它包含在单引号 '\"' 中——所以你正在定义 fields-enclosed -by反斜杠引用not 只是 quote。试试--fields-enclosed-by='"'
  • 不使用反斜杠时同样的问题,我可以使用'"'或'\"',结果相同,所有日期都进入第一列。
  • 我以几乎相同的方式运行更改后的命令,并且运行良好。这是我运行的命令:mysqlimport -u username -p --local --ignore-lines=1 myschema tablename.csv --fields-enclosed-by='"' --lines-terminated-by='\n' --fields-terminated-by=',' (... schema/table/user 从我的 actual 命令替换) 我只是以 \n 而不是 \r\n 终止,因为我创建了 csv 文件我的 Mac(OS X 是 Unix)
  • 运行几乎相同并导入了一半: $ mysqlimport -u root --local --ignore-lines=1 rr_ccdb Companies.csv --fields-enclosed-by='"' --lines -terminated-by='\n' --fields-terminated-by=',' rr_ccdb.companies:记录:1532 已删除:0 跳过:0 警告:1613

标签: mysql mysqlimport


【解决方案1】:

我认为 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

【讨论】:

  • 我用的是反斜杠,没区别,结果一样。
  • 我去掉了反斜杠,没有区别。
【解决方案2】:

测试架构:

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

导入数据没问题

从aT中选择*; -- 查看导入

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

truncate aT; -- run this first

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

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

【讨论】:

  • 我的文件来自 Microsoft 系统,编码为 WES​​TERN - ISO LATIN1。加载失败,因为我的 MySQL 数据库编码为 UTF-8。收到错误 ERROR 1300 (HY000): Invalid utf8 string: '"N'。如何更新命令 LOAD DATA 以计算编码差异?我只能在将 CSV 文件转换为 UTF-8 后才能加载,但这不是大文件的选项。
  • 如果我有你的 Dropbox 文件用于测试,(一个中小型的讨厌的文件),我可以测试它。此外,如果我要知道允许什么使其工作,例如用于导入的临时表或您在接收端拥有的确切创建表语句。如果在我开始之前可以传达这些信息,我不想花时间做会被拒绝的事情。
  • 对不起,我在Postgres中尝试导入后才发现编码问题,这是成功的。 MySQL向我证明了许多缺点。这是其中之一。将所有数据放在一列中,而不是提供错误并拒绝加载。 Postgres 有一个参数要在加载期间设置用于编码。对于 MySQL,我必须在加载成功之前使用 UTF-8 编码保存文件。简而言之,如果没有 Postgres,我将无法为 MySQL 修复它。这不是 MySQL 需要解决的问题吗?
  • 如前所述,了解您的 create table stmt 会有所帮助。那还没有提供。也许这有帮助:stackoverflow.com/q/4957900
  • 是的,我做到了,结果相同,没有区别。我已经搬到了 Postgres。没有问题,没有麻烦。
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多