【发布时间】: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 无济于事。
非常感谢任何见解
【问题讨论】: