【问题标题】:Invalid utf8 character string when importing csv file into MySQL database将csv文件导入MySQL数据库时utf8字符串无效
【发布时间】:2018-02-27 18:47:24
【问题描述】:

我使用以下命令将数据从 .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”的输入格式是错误的并且没有适合 MySQL 数据库中使用的 utf8 格式吗?

但是,我已经在我的 MySQL 数据库中执行了以下操作,即 SET NAMES UTF8MB4,因为在其他问题中建议 UTF8MB4 在接受奇怪字符方面更灵活。

我通过在命令提示符中手动将奇怪的数据插入 MySQL 数据库表中进一步探索了这一点,效果很好。事实上,表格几乎显示了完整的条目:viva Y31L.RastaMod?ã¢_Version。但是如果我从 IDE 运行我的程序,文件就会被拒绝。

希望有任何解释。

关于csv文件导入mySQL过程的第二个小问题:

我注意到我无法将同一文件的副本导入 MySQL 数据库。引发的错误包括数据重复。那是因为 MySQL 拒绝重复的列数据吗?但是,当我更改一列的所有数据时,在复制的文件中其余部分保持不变,它会正确导入。为什么呢?

【问题讨论】:

    标签: java mysql csv


    【解决方案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')
    

    话虽如此,您还应该确保目标表使用的字符集支持您尝试加载到其中的数据。

    【讨论】:

    • 我按照建议以 java 形式修改了上面的内容,但仍然得到相同的错误 =/ String loadQuery = "LOAD DATA LOCAL INFILE '" + 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')";
    • source_data_android_cell表的编码是什么?
    • 更新:我发现使用 CHARACTER SET latin1 似乎可以解决问题,也许我提到的数据中的一个奇怪符号似乎不适合 utf8。感谢您指导我找到该解决方案!
    • @Mack 不,我认为问题可能在于您的表是latin1UTF8 包含比 latin1 更广泛的字符。
    • 当我尝试两次导入同一个文件时,您能解释一下重复错误部分吗?所以mysql不允许重复信息?
    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多