java - csv字符集加载infile问题

标签 java mysql csv jdbc utf-8

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

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

我正在基于 csv header 创建一个表 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中传入文件的编码?

P.S 我在加载表时没有丢失非 utf8 字符的问题,我唯一的目的是成功地将文件上传到数据库中,而不会给出任何错误,无论编码如何。

谢谢

最佳答案

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

创建一个“临时”表以将 LOAD 中的数据放入其中。但所有 VARCHAR 列均为 VARBINARYTEXT 均为 BLOB。这样数据字节将被不变地加载。

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

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

然后将数据复制到您的“真实”表(除非该表足够)。

如果一个混合了多种编码,那么你就太优秀了。

识别字符集

在列中提供一个或两个非英语字符的十六进制示例;我通常能认出它是什么。 This给出了如何从十六进制样本中识别字符集的一些线索。

关于java - csv字符集加载infile问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41957880/

相关文章:

java - 寻找一些关于从头开始创建 ArrayLists(Java 中)方法的好资源

java - 我的 DiffUtil 实现有什么问题?

mysql - PHP/MYSQL 脚本的负载平衡,无需大的代码更改

windows - 有哪些优秀的免费 CSV 编辑器程序?

Java 问题 CSV/batch/js in jar

python - 在Python中读取巨大的csv文件、处理然后写入处理后的csv的最快方法

java - 更改正在使用的java版本

java - 多级继承子类调用 'grand'父函数

Mysql带日期范围、多表汇总查询

MySQL 对关联表上的多行进行过滤