一个表的一个字段url(text)的数据太长导致update这个字段发生错误如下 SQL Exception: Data truncation: Data too long for column 'url' at row 1 
java.sql.BatchUpdateException: Data truncation: Data too long for column 'url' at row 1
由于没有加上log日志,导致珍贵的错误数据无法再现。
现在想在我的java +mysql 代码 加上log4j的错误异常写到日志里 。
具体我不知道如何配置,如何在java代码的try catch里抓到这个
update a set url=‘。’语句的错误表达。(我查看官方文档 text达到65536应该不是长度限制 我估计还是其他原因造成的)。如何使用java的文本日志来catch里抓到这个无法执行的sql语句。

解决方案 »

  1.   

    用form post提交
    不用在url里写
    action直接可以用request.getP。
    获取到
      

  2.   

    你这个表中url字段类型是多少?长度多少?输入的内容是什么?
      

  3.   

    如果你的URL是text类型的,你可以改用
    PreparedStatement prep = conn.prepareStatment("update a set url=?...");
    StringReader reader = new StringReader(url);
    prep.setCharacterStream(1, reader, url.length());
    prep.executeUpdate();这样才是最好的写法,拼SQL语句最好能不用就不用。否则SQL注入等一堆问题
      

  4.   

    try catch{
     log.info(sql); system.out.println(sql);
    }
      

  5.   

    感谢楼上 可能问题不是那么简单的哦
    前面是update a set nam=? and dis=? and startdate=? and enddate=?
    ps.setLong(psIndex++, event.getId());
    ps.setObject(psIndex++, event.getName());
    ps.setLong(psIndex++, event.get());
    ps.setObject(psIndex++, event.getStartDate());
    ps.setObject(psIndex++, event.getEndDate());
    ps.execute();
    并不是那种 给个sql 之后ps.execute(sql)方式的(如果那样 就好了 实际情况要复杂很多倍);
    请问这种方式可以获得sql语句吗???
      

  6.   

    可能 URL 里面含有 & 什么的,在 Oracle 中这个符号在 SQL 语句中有特殊的含义,由于错误数据没有记录下来,所以现在也只能是猜测。另外,你在 5 楼提到的,需要举个实际的例子,否则很难解决。
      

  7.   

    嗯,你是不会配置 log4j,还是不会写日志?
      

  8.   

    不是 update a set nam=? and dis=? and startdate=? and enddate=? 
    ps.setLong(psIndex++, event.getId()); 
    ps.setObject(psIndex++, event.getName()); 
    ps.setLong(psIndex++, event.get()); 
    ps.setObject(psIndex++, event.getStartDate()); 
    ps.setObject(psIndex++, event.getEndDate()); 
    ps.execute(); 
    这个sql 语句如何可以得到?  (我得到以后 才能写到日志文本)
      

  9.   

    不是如何写日志的问题 
    是如何得到这个sql的问题
      

  10.   

    这个 SQL 你是得不到的,因为 JDBC 直接把 update a set nam=? and dis=? and startdate=? and enddate=?  这个交给数据库,由数据库负责填充参数,其中的 SQL 语句只有那个带问号的,再此之外
    就没有 SQL 语句了。如果你要求不是很高的话可以试着使用其他的方法,这种方法只能看看,并不是真正意义上的 SQL,
    需要 JDK 5 或以上的版本:import org.apache.log4j.Logger;public class Test6 {
        
        private final static Logger LOG = Logger.getLogger(Test6.class);
            
        public static void main(String[] args) {
            String sql = "update a set nam=? and dis=? and startdate=? and enddate=?";
            Long id = 1L;
            String name = "abc";
            Long get = 5L;
            Date startDate = new Date();
            Date endDate = new Date();
            
            if(LOG.isInfoEnabled()) {
                putLog(LOG, "SQL:", sql, id, name, get, startDate, endDate);
            }
        }
        
        public static void putLog(Logger log, String prefix, String sql, Object... objs) {
            if(log.isInfoEnabled()) {
                log.info(prefix + " " + String.format(sql.replace("?", "%s"), objs));
            }
        }
    }
      

  11.   

    感谢楼上 不要那个sql也可以
    得到数据也可以的 
      

  12.   

    把表的长度加长点 如varchar(1000)