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

Posted

技术标签:

【中文标题】如何使用 Java 将特殊字符插入 MySQL【英文标题】:How to insert special characters into MySQL using Java 【发布时间】:2016-05-26 18:05:08 【问题描述】:

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

这是我的 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;

         

代码运行良好,直到在 Material Description 中遇到一个特殊字符,如度数符号或微符号 µ。那时它会抛出一个异常

Invalid utf8 character string: 'LUG'

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

非常感谢任何见解

【问题讨论】:

【参考方案1】:

你有没有尝试添加

CHARACTER SET UTF8

LOAD DATA INFILE 指令?

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

【讨论】:

是的,我几天前试过了,它仍然抛出同样的异常。我编辑了我的帖子以反映我试图设置字符集。在过去的几天里,我几乎尝试了所有基于 MySQL 文档的 LOAD DATA INFILE 文档,但感谢您的努力【参考方案2】:

您能否检查数据库排序规则utf8_general_ci 和字符集utf_8,它可能适合您。

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

【讨论】:

这是我第一次看到异常时使用的原始 UTF8 排序规则。我刚刚又试了一次,它仍然抛出相同的异常。谢谢【参考方案3】:

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

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

我希望这将在未来对其他人有所帮助。

拍拍

【讨论】:

以上是关于如何使用 Java 将特殊字符插入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

如何将₹(特殊字符)插入数据库

如何使用mysql insert 插入特殊字符?

MySQL 在特殊字符处截断字符串

如何在 Windows 上使用 Sed 将特殊字符插入文本文件?

如何强制 mySQL 数据库存储这个特殊字符:╠?

避免mysql注入应该避免都有哪些特殊字符