我有一个 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\
我现在应该做什么
- 我应该在上传之前将所有文件转换为 utf8 吗?如果是,那么在 Java 中如何实现
- 我应该为多个编码文件设置多个编码表吗?如果是,那么我如何检测java中传入文件的编码?
P.S 我在加载表时没有丢失非 utf8 字符的问题,我唯一的目的是成功地将文件上传到数据库中,而不会给出任何错误,无论编码如何。
谢谢
最佳答案
如果您的意思是某些列是 utf8,而某些列是 latin1,那么它会变得有点复杂,但仍然是可能的。
创建一个“临时”表以将 LOAD
中的数据放入其中。但所有 VARCHAR
列均为 VARBINARY
,TEXT
均为 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/