如何使用Java将特殊字符插入MySQL

时间:2016-05-26 18:05:09

标签: java mysql sql

我在使用Java加载到MySQl中时有几个csv文件。在Description字段中,我有几个特殊字符导致加载失败。我正在使用LOAD DATA INFILE,如下面的代码块所示。这嵌套在for循环中,每个循环解析一个文件名/表数组并运行每个组合,直到完成所有文件。

这是我的jdbc连接字符串,我在其中传递UTF8校对的权威校对参数/值

 static String  url = "jdbc:mysql://localhost:3306/iber_stage?verifyServerCertificate=false&characterEncoding=UTF8";

其他连接参数并解析文件名/表名数组

 final String sql1 = ("TRUNCATE TABLE" + tableName);
 final String sql2 = ("LOAD DATA INFILE" + filetoEat  + "INTO TABLE staging." +tableName + "CHARACTER SET UTF8 FIELDS TERMINATED BY',' ENCLOSED BY '\"\' LINES TERMINATED BY '\n' IGNORE 1 LINES");

        try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(url, username, password);
        st = con.createStatement();
        st.executeUpdate(sql1);
        rs = st.executeQuery(sql2);

        if (rs.toString() != null) {
            returnMsg = rs.toString();
            System.out.println(returnMsg);        
            updFlag = 0; 
            String strRecs = returnMsg.substring(40);
            updateControlTable(updFlag, strRecs);
        }

        } catch (SQLException ex) {
            Logger lgr = Logger.getLogger(update.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);
            updFlag = 1;            

        } catch (ClassNotFoundException e) {
            Logger lgr = Logger.getLogger(update.class.getName());
            lgr.log(Level.SEVERE, e.getMessage(), e);
            e.printStackTrace();
            updFlag = 1;

        } 

代码工作正常,直到遇到材料描述中的度数符号或微符号μ等特殊字符。此时它会抛出异常

Invalid utf8 character string: 'LUG'

字符串LUG后跟一个μ符号。数据库设置为utf8 - utf8_unicode_ci,有问题的列是包含材料描述的VARCHAR(60)。 我尝试过使用ESCAPED BY '\\',但我似乎无法正常使用它。我也试过CHARACTER SET UTF8。我也尝试过不同的排序规则,即utf8_general_ci无效。

非常感谢任何见解

3 个答案:

答案 0 :(得分:0)

您是否尝试过添加

CHARACTER SET UTF8

LOAD DATA INFILE指令?

完整文档:http://dev.mysql.com/doc/refman/5.7/en/load-data.html

答案 1 :(得分:0)

您可以查看数据库归类utf8_general_ci和字符集utf_8,它可能适合您。

因为它使用特定于语言的规则来应用Unicode规范化。

答案 2 :(得分:0)

我想我现在可以回答这个问题,因为我找到了解决方案。因为我使用Java通过JDBC运行LOAD DATA INFILE,所以JDBC驱动程序似乎正在检查数据库中的排序规则,而不是在解析文件时正在加载的实际表。因此,您不能将数据库设置为UTF-8并且具有拉丁整理表,因为您可以使用INSERT语句。我曾尝试将Table排序规则设置为拉丁语,甚至将字段设置为拉丁语,但直到我将整个数据库更改为拉丁语才失败。 CSV文件很大,因此检查所讨论的每个字符都不容易,但我正在捕获Java中的异常,并且能够确定错误是由JDBC驱动程序生成的,并且抱怨“xx行的字符不是UTF -8字符“在Debug中运行允许我查看更多详细信息。

然后我得出结论,它一定不是要查看它将填充的拉丁语整理表,而是查看仍然设置为UTF-8的DB。我需要将DB更改为拉丁文。

我希望这将有助于其他人。

专利