2016-05-26 4 views
2

У меня есть несколько файлов csv, загружаемых в MySQl с помощью Java. В поле «Описание» у меня есть несколько специальных символов, которые вызывают потерю нагрузки. Я использую LOAD DATA INFILE, как показано в блоке кода ниже. Это вложен в a для каждого цикла, который анализирует массив имен файлов/таблиц и проходит через каждую комбинацию до тех пор, пока она не будет закончена со всеми файлами.Как вставить специальные символы в MySQL с помощью Java

Вот мой JDBC Строка соединения, где я прохожу окончательную сверку параметр/значение для UTF8 сортировки

static String url = "jdbc:mysql://localhost:3306/iber_stage?verifyServerCertificate=false&characterEncoding=UTF8"; 

других параметры соединения и разбор массив имен файлов/tablenames

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

Вы пытались добавить

CHARACTER SET UTF8 

к LOAD DATA INFILE инструкции?

Полный документ: http://dev.mysql.com/doc/refman/5.7/en/load-data.html

+0

Да, я попробовал пару дней назад, и он по-прежнему бросает то же Исключение. Я редактировал свой пост, чтобы подумать, что я попытался установить кодировку. Я в значительной степени пробовал все, что мог, основываясь на документах MySQL для LOAD DATA INFILE за последние пару дней, но благодаря усилиям – apesa

0

Вы можете проверить с сортировки базы данных utf8_general_ci и наборе символов utf_8, он может работать для вас.

Как он применяет нормализацию Юникода с использованием специфических для языка правил.

+0

Это была оригинальная сортировка UTF8, которую я использовал, когда впервые увидел исключение. Я просто попробовал еще раз, и он все равно бросает одно и то же Исключение. благодаря – apesa

0

Я подумал, что я бы ответил на это сейчас, когда нашел решение. Поскольку я использую Java для запуска через JDBC, драйвер JDBC, похоже, проверяет сортировку в БД, а не фактическую таблицу, загружаемую по мере ее разбора. Таким образом, вы не можете установить БД в UTF-8 и иметь таблицу с латинским сопоставлением, как вы могли бы сделать с оператором INSERT. Я попытался установить сортировку таблицы как латинскую и даже имел поле, о котором идет речь на латыни, но пока я не сменил всю БД на латынь, он потерпел неудачу. Файлы CSV большие, поэтому проверка каждого рассматриваемого символа непростая, но я ловил Исключения в Java и смог определить, что ошибка была сгенерирована драйвером JDBC, и жаловался, что «Символ в строке xx не является UTF -8 character «Выполнение в Debug позволило мне увидеть более подробную информацию.

Я тогда пришел к выводу, что он не должен смотреть на латинский стол, который он будет заполнять, но смотрел на БД, который все еще был установлен на UTF-8. Изменение БД на латынь было всем необходимым.

Я надеюсь, что это поможет другим в будущем.

Pat

Смежные вопросы