如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章