我在使用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
无效。
非常感谢任何见解
答案 0 :(得分:0)
您是否尝试过添加
CHARACTER SET UTF8
到LOAD DATA INFILE
指令?
答案 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更改为拉丁文。
我希望这将有助于其他人。
专利