[英]How to insert special characters into MySQL using Java
我正在使用Java將多個csv文件加載到MySQl中。 在“描述”字段中,我有幾個導致加載失敗的特殊字符。 我正在使用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后跟一個µ符號。 DB設置為utf8- utf8_unicode_ci
,相關utf8_unicode_ci
VARCHAR(60),其中包含材料描述。 我嘗試使用ESCAPED BY '\\\\'
但似乎無法正常工作。 我也嘗試過CHARACTER SET UTF8
。 我也嘗試了不同的排序規則,即utf8_general_ci
,但無濟於事。
非常感謝任何見解
您是否嘗試過添加
CHARACTER SET UTF8
LOAD DATA INFILE
指令?
完整文檔: http : //dev.mysql.com/doc/refman/5.7/en/load-data.html
您可以使用數據庫排序規則utf8_general_ci
和字符集檢查為utf_8
檢查utf_8
,它可能對您utf_8
。
由於它使用特定於語言的規則應用Unicode規范化。
我發現找到解決方案后便會回答這個問題。 因為我使用Java通過JDBC運行LOAD DATA INFILE
,所以JDBC驅動程序似乎正在檢查數據庫中的排序規則,而不是在分析文件時正在檢查的實際表。 因此,您不能像使用INSERT
語句那樣將數據庫設置為UTF-8,也不能使用拉丁文排序表。 我曾嘗試將Table排序規則設置為Latin,甚至將問題字段設置為Latin,但是直到我將整個數據庫更改為Latin之前,它都失敗了。 CSV文件很大,因此檢查每個有問題的字符並不容易,但是我捕獲了Java中的異常,並且能夠確定該錯誤是由JDBC驅動程序生成的,並抱怨“第XX行的字符不是UTF -8字符”在Debug中運行使我能夠看到更多詳細信息。
然后,我得出結論,它一定不是在查看將要填充的拉丁排序表,而是在查看仍設置為UTF-8的數據庫。 我需要做的就是將數據庫更改為拉丁語。
我希望這會在將來對其他人有所幫助。
拍
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.