0

У меня есть таблица MySQL с столбцом Double datatype, когда я вставляю значение, содержащееся в Java Double. Я всегда получаю ошибку усечения.Mysql DOUBLE данных столбца с усеченным исключением с использованием Java Double

Mrz 19, 2015 11:26:00 AM databaseimport.MyImport ExecuteQuery SCHWERWIEGEND: нуль java.sql.SQLException: Данные усечены для столбца 'ДОЛЯ' в строке 1

Я попытался изменить столбец с более высокой точностью с DOUBLE PRECISION (30,30), который кажется максимальным для DOUBLE, но ошибка остается.

Вот пример сниппет:

Double share = (Double) shareRow.get("share"); 

sql = ("INSERT INTO `SHARE_VALUES` (`ID`, `SHARE`)" + 
     "VALUES (NULL, "+share+");"); 
try 
     { 
      // Create a Preparedstatement 
      PreparedStatement ps; 
      ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
      ps.execute(); 
      ResultSet generatedKeys = ps.getGeneratedKeys(); 

     } 
     catch (SQLException ex) 
     { 
      java.util.logging.Logger.getLogger(Shares.class 
        .getName()).log(Level.SEVERE, null, ex); 

      return -1; 
     } 
+1

, пожалуйста, предоставьте отредактированный код java инструкции вставки/обновления .... – Marcx

+0

Каков размер столбца SHARE? – ConMan

+0

Ожидал бы, что 'DOUBLE (30, 15)' будет работать, скажем, '1.5'. Попробуйте все в консоли консоли mysql, workbench, Toad или IDE SQL. Я думаю, что проблема была в том, что касается целого числа цифр, мантиссы. –

ответ

0

Попробуйте сделать это вместо:

sql = String.format(Locale.US, "INSERT INTO `SHARE_VALUES` (`ID`, `SHARE`)" + 
     "VALUES (NULL, %.3f);", share); 

При конкатенации строк Java может использовать локаль, чтобы включить, например, 6.80 в "6,80" < - Знак comma (',') имеет разное значение для MySQL, и это может вызвать множество проблем.

Если вы собираетесь использовать подготовленное заявление, то это будет больше похоже на него:

NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());  
Double share = nf.parse(shareRow.get("share")).doubleValue(); 

sql = ("INSERT INTO `SHARE_VALUES` (`ID`, `SHARE`)" + 
     "VALUES (NULL, ?);"); 
try 
{ 
    // Create a Preparedstatement 
    PreparedStatement ps; 
    ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
    ps.setDouble(1, share); 
    ps.execute(); 
    ResultSet generatedKeys = ps.getGeneratedKeys(); 

} 
catch (SQLException ex) 
{ 
    java.util.logging.Logger.getLogger(Shares.class 
      .getName()).log(Level.SEVERE, null, ex); 

    return -1; 
} 

Обратите внимание, что строка запроса поставляется с «?» знаки, они указывают параметры. Когда вы звоните:

ps.setDouble(1, share); 

, который будет указать, что параметр 1 значение share, таким образом, первый «?» знак заменяется значением share (полностью осведомленный о конверсиях Java в mysql и никаких проблем с локалью).

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

  • Нет связанных вопросов^_^