将csv文件(Coding = UCS2)加载到自制表中的问题

时间:2017-01-05 15:34:36

标签: mysql csv

我尝试“自动”将数据从csv(UCS-2 LE Bom编码)导入到我之前创建的表中。但每当我尝试通过命令行导入数据时,我都会收到此错误:

Error Code: 1300. Invalid utf8mb4 character string: ''  0.016 sec

这是我创建表的查询,并尝试使用以下内容插入数据:

DROP TABLE IF EXISTS `Import`;
CREATE TABLE `Import` (
`orderdate` DATETIME DEFAULT NULL,
`Kampagne` INT(7) DEFAULT NULL,
`Kampagnename` VARCHAR(150) DEFAULT NULL, 
`sent(overall)` INT(15) DEFAULT NULL, 
`number of E-Mails` INT(15) DEFAULT NULL, 
`BouncesÄ (overall)` INT(15) DEFAULT NULL,
`openedÜ (overall)` INT(15) DEFAULT NULL,
`On mobileÖ (overall)` INT(15) DEFAULT NULL,
`clicks` INT(15) DEFAULT NULL,
`clicks mobile` INT(15) DEFAULT NULL,
`sold` INT(15) DEFAULT NULL,
`Complaints (overall)`INT(15) DEFAULT NULL,
`logged out(overall)` INT(15) DEFAULT NULL,
`money` INT(15) DEFAULT NULL,
`rateOne%` FLOAT DEFAULT NULL,
`rateTwo%` FLOAT DEFAULT NULL,
`Bouncerate %` FLOAT DEFAULT NULL,
`Openrate%` FLOAT DEFAULT NULL,
`Openrate(mobil) %` FLOAT DEFAULT NULL, 
`clickrate %` FLOAT DEFAULT NULL,
`clickrate (mobil) %` FLOAT DEFAULT NULL,
`soldrate %` FLOAT DEFAULT NULL,
`rateThree %` FLOAT DEFAULT NULL,
`rateFour %` FLOAT DEFAULT NULL
)ENGINE=InnoDB DEFAULT CHARSET=UCS2;


LOAD DATA LOCAL INFILE 'C:/Test/Report.csv' INTO TABLE `Import` 
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n';

有没有人知道这个问题在哪里?

PS:CSV中的列具有与创建的表中相同的“名称”。

CSV文件中的数据

orderdate;Kampagne;Kampagnename;sent(overall);number of E-Mails;BouncesÄ (overall);openedÜ (overall);On mobileÖ (overall);clicks;clicks mobile;sold;Complaints (overall);logged out(overall);money;rateOne%;rateTwo%;Bouncerate %;Openrate%;Openrate(mobil) %;clickrate %;clickrate (mobil) %;soldrate %;rateThree %;rateFour %
2016-12-07 10:03;2131466;20161207_1002_LC_YoBirthdayYes_LCAll_FR;20;20;0;6;3;1;0;0;0;0;0;100;100;0;30;15;5;0;0;0;0
2016-12-07 10:03;2131467;20161207_1002_LC_YoBirthdayYes_LCAll_UK;9;9;0;5;4;1;1;0;0;0;0;90;100;0;55.6;44.4;11.1;11.1;0;0;0
2016-12-07 10:03;2131465;20161207_1002_LC_YoBirthdayYes_LCAll_CH;11;11;0;4;2;0;0;0;0;0;0;91.7;100;0;36.4;18.2;0;0;0;0;0

1 个答案:

答案 0 :(得分:0)

在LOAD语句中,您需要使用LOAD DATA LOCAL INFILE 'C:/Test/Report.csv' INTO TABLE `Import` CHARACTER SET 'UCS2' FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES; 子句指定文件字符集。否则使用默认字符集(从您的情况中的消息 - utf8mb4)。您可以参考文档here

ucs2

utf8mb4usc2都是unicode字符集,但它们不兼容。 tr使用两个字节的字符序列,而utf8mb4使用可变长度 - 最多4个字节的字符序列来编码字符。

如果您的文件具有Windows样式的行终止符(CRLF),则需要进行转换。一种方法是使用Unix / Linux tr -d '\r' inputfile.txt outputfile.txt 命令:

SELECT   e.department_id, d.department_name, e.AVG(salary)
FROM     employees e
JOIN     departments d
ON      (e.department_id = d.department_id)
GROUP BY department_id, department_name;

关于行结尾的说明

要了解文件使用的行结尾,请在Notepad ++(仅限Windows)中打开它,然后从菜单中选择:编辑 - > EOL转换。有三个项目。灰色项目显示文件的样式。您可以通过选择“Unix(LF)”选项并保存文件,在Notepad ++中直接转换它。

<强>建议

我建议您使用简单的名称命名列,而不使用特殊字符和空格。这样,在SQL中引用它们就会更容易。就像现在一样,您必须始终引用列名称。当您需要具有“业务意义”列名称时,可以在选择中使用别名。