我有一个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\
我现在应该做什么,
P.S我在向表中加载时错过了非utf8字符没有任何问题,我唯一的目的是在DB中成功上传文件而不会出现任何错误,无论编码如何。
由于
答案 0 :(得分:0)
如果你的意思是某些列是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 ...,
...;
然后将数据复制到“真实”表格中(除非此表格足够)。
如果一个列混合了编码,那么你就是SOOL。
识别字符集
在列中提供一个或两个非英语字符的HEX;我通常可以发现它是什么。 This提供了一些如何从十六进制样本中识别字符集的线索。