2011-06-01 45 views
2

你好我试图执行查询的Java SQL空字段

Statement stmt = conn.createStatement(); 
stmt.executeUpdate(location_query); 

location_query是

insert into table(col, col2) value("2", ""); 

两个关口和COL2是双(12,2)型,我得到错误 Data truncated for column 'col2' at row 1,但如果我打印我的查询并复制,并将其粘贴到PMA(PhpMyAdmin)其正确。

我发现它的col2的colouse值是空的,但有没有机会以其他方式解决这个问题,而不是检查所有的变量,我试图把我的查询?

+0

被COL2定义为可空? – DaveH 2011-06-01 09:46:10

+0

不是它的默认空,但我可以改变它 – 2011-06-01 09:56:53

回答

5

那么,一个空字符串不是一个有效的数字,因此不同的数据库系统可能会有不同的处理方式。如果你只是想该列NULL或填充默认情况下,你应该把它弄成这样:

insert into table(col) value(2); 

或将其设为NULL明确:

insert into table(col, col2) value(2, NULL); 

此外,数字没有在SQL引号写。此外,你应该只使用PreparedStatements。 PreparedStatements为你提供了类型安全并防止SQL注入的问题,重用时可能会更快。

看看google "statement vs. preparedstatement"

编辑

您例如使用预处理语句时,会是这个样子,:

String yourFirstString = "2.34"; 
String yourSecondString = ""; 

double yourFirstDouble = 0; 
double yourSecondDouble = 0; 

if(yourFirstString != null && yourFirstString.trim().length() > 0){ 
    try { 
    yourFirstDouble = Double.parseDouble(yourFirstString); 
    }catch(NumberFormatException e){ 
    // handle Exception here 
    } 
} 

// same parsing for the second double 

PreparedStatement stmt = conn.prepareStatement("insert into table (col, col2) value(?, ?)"); 
stmt.setDouble(1, yourFirstDouble); 
stmt.setDouble(2, yourSecondDouble); 
stmt.executeUpdate(); 
+0

好吧,但会preparedStatements保护我免受空值并secound的事情是,我永远不知道哪个值是空的这就是为什么我必须把它们全部 – 2011-06-01 09:58:25

+0

因为'setDouble(int,double)'是类型保存你只能使用有效的双打作为参数。这意味着,您无法将空字符串应用于该语句。你应该测试该字符串是否为空,如果是,则设置0或NULL。否则,你应该尝试将String解析为一个double并使用它。我会编辑我的答案并添加一个例子。 – 2011-06-01 11:41:10

+0

我添加了一些解析示例。但是,所有这些逻辑都不应该在同一个地方。在我猜测,用户输入值的解析应当在GUI逻辑附近输入时进行验证。但是,数据库层应该只能获得双精度,而不能进行字符串解析,验证等。 – 2011-06-01 11:47:25