csv字符集加载infile问题

时间:2017-01-31 12:40:58

标签: java mysql csv jdbc utf-8

我有一个MySQL数据库,标准编码和服务器编码全部设置为utf8.I有多个编码的csv文件,我必须使用jdbc加载到数据库中。但是当传入文件编码ANSII时,加载数据infile失败

java.sql.SQLException: Invalid utf8 character string: '1080'

我正在基于csv头创建一个表table_abc,然后使用以下查询将csv文件加载到数据库中

LOAD DATA LOCAL INFILE 'XXX.csv' INTO TABLE table_abc CHARACTER SET UTF8  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES

这是我的数据库定义

character_set_client    utf8
character_set_connection    utf8
character_set_database  utf8
character_set_filesystem    binary
character_set_results   utf8
character_set_server    utf8
character_set_system    utf8
character_sets_dir  C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\

我现在应该做什么,

  1. 我应该在上传之前将所有文件转换为utf8吗?如果是,那么在Java中如何
  2. 我应该为多个编码文件使用多个编码表吗?如果是,那我如何在java中检测传入文件的编码?
  3. P.S我在向表中加载时错过了非utf8字符没有任何问题,我唯一的目的是在DB中成功上传文件而不会出现任何错误,无论编码如何。

    由于

1 个答案:

答案 0 :(得分:0)

如果你的意思是某些列是utf8而某些列是latin1,那么它会有点复杂,但仍然可能。

创建一个“临时”表,将数据放入LOAD。但是,所有VARCHAR列都是VARBINARYTEXTBLOB。这样,数据字节将不加载地加载。

然后ALTER该表将二进制/ blob列转换为合适的varchar / text类型:

ALTER ...
    MODIFY COLUMN col1 VARCHAR(111) CHARACTER SET ... COLLATION ...,
    MODIFY COLUMN col2 TEXT CHARACTER SET ... COLLATION ...,
    ...;

然后将数据复制到“真实”表格中(除非此表格足够)。

如果一个混合了编码,那么你就是SOOL。

识别字符集

在列中提供一个或两个非英语字符的HEX;我通常可以发现它是什么。 This提供了一些如何从十六进制样本中识别字符集的线索。