我使用以下命令将.csv文件中的数据导入到MySQL数据库表中,如下所示:
String loadQuery = "LOAD DATA LOCAL INFILE '" + file + "' INTO TABLE source_data_android_cell FIELDS TERMINATED BY ','" + "ENCLOSED BY '\"'"
+ " LINES TERMINATED BY '\n' " + "IGNORE 1 LINES(.....)" +"SET test_date = STR_TO_DATE(@var1, '%d/%m/%Y %k:%i')";
但是,由于源文件中的一个列包含一个非常棘手的数据:viva Y31L.RastaMod‰ã¢_Version
,程序拒绝将数据导入MySQL并继续抛出此错误:
java.sql.SQLException:无效的utf8字符串:'viva Y31L.RastaMod'
我搜索了这个,但是不能真正理解错误到底是什么,除了这个字符串“ viva Y31L.RastaMod‰_Version ”的INPUT格式错误而且没有适合MySQL数据库中使用的utf8格式?
但是,我已经在我的MySQL数据库中执行了以下SET NAMES UTF8MB4
,因为在其他问题中建议UTF8MB4更灵活地接受奇怪的字符。
我通过在命令提示符中手动将奇怪的数据插入到MySQL数据库表中进一步探索了这一点,该工作正常。实际上,该表几乎显示了完整的条目:viva Y31L.RastaMod?ã¢_Version
。但是如果我从IDE运行我的程序,文件就会被拒绝。
感谢任何解释。
与csv文件导入mySQL相关的第二个小问题:
我注意到我无法将同一文件的副本导入MySQL数据库。抛出的错误包括数据是重复的。这是因为MySQL拒绝重复的列数据吗?但是当我更改了一个列的所有数据而其余部分在复制的文件中保持相同时,它会被正确导入。为什么会这样?
答案 0 :(得分:1)
我不认为这个即时错误与数据的目的地无法应对UTF-8字符有关,而是与您使用LOAD DATA
的方式有关。您可以尝试指定加载数据时应使用的字符集。考虑以下LOAD DATA
命令,这是您最初使用但略微修改的命令:
LOAD DATA LOCAL INFILE path/to/file INTO TABLE source_data_android_cell
CHARACTER SET utf8
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES(.....)
SET test_date = STR_TO_DATE(@var1, '%d/%m/%Y %k:%i')
话虽如此,您还应确保目标表使用支持您尝试加载到其中的数据的字符集。