簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM