我使用以下命令将数据从.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拒绝重复的列数据吗?但是,当我更改一列的所有数据,而其余部分在该复制文件中保持不变时,它将被正确导入。为什么呢?
最佳答案
我认为此立即错误与数据目标不能处理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')
话虽如此,您还应确保目标表使用的字符集支持您尝试加载到其中的数据。