【问题标题】:Data truncation: Data too long for column 'Phone' at row 1数据截断:第 1 行的“电话”列的数据太长
【发布时间】:2014-07-11 13:39:11
【问题描述】:

我正在将数据插入到 MYSQL 数据库的临时表中。我将“电话”列的大小指定为 VARCHAR(20),并插入了正好 10 个字符的数据,并且它是恒定的。

这是我的代码:

java.sql.PreparedStatement insertStmt = null;

                 String insertQuery = "insert into "+tableName+"(";
                 for(String col : columnList){
                             insertQuery+=col+",";
                         }
                insertQuery = insertQuery.substring(0,insertQuery.lastIndexOf(","));
                         insertQuery+=") values (";
                         for(String col : columnList){
                             insertQuery+="?,";
                         }
                insertQuery = insertQuery.substring(0,insertQuery.lastIndexOf(","));
                            insertQuery+=")";
                         insertStmt = mysqlConn.prepareStatement(insertQuery);

                while(rs.next())
                     {
                    for(int j=1;j<=columnList.size();j++)
                    {
                        insertStmt.setString(j,rs.getString(j).trim());
                        System.out.println(rs.getString(j).trim());
                    }
                    insertStmt.addBatch();
                    i++;

                    }
                insertStmt.executeBatch();  

                mysqlConn.setAutoCommit(true);
                rs = null;

我得到以下错误:

java.sql.BatchUpdateException: Data truncation: Data too long for column 'Phone' at row 1
Completed Temp tables 1&2
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
    at MultipleDataExtraction.addDataToTempTable(MultipleDataExtraction.java:132)
    at MultipleDataExtraction.addDataToFinalTempTable(MultipleDataExtraction.java:94)

表定义:

EmpNo varchar(15) YES NULL,   Name varchar(18) YES NULL,   Address varchar(40) YES NULL,   Phone varchar(20) YES NULL,   Age varchar(4) YES NULL,  DeptNo varchar(20) YES NULL

插入语句:

insert into temp__final_table(Name,Address,Phone,EmpNo,Age,DeptNo) values ('Clerk#000000959','Skye Norling','2112 Ravine Drive','7091581728','Clerk#000000959','26') 

请帮忙..

【问题讨论】:

  • 数据太长(很明显)——在执行之前把插入语句吐出来,粘贴到这里。
  • 错误很明显,您的列phone 的长度不足以容纳您尝试插入的电话号码。您尝试的phone 值是什么,mysql 中的列定义是什么?
  • 那是一种糟糕的创建 SQL 语句的方式。至少在 Java 教程中看看它是如何完成的:docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
  • 示例电话值为 7091581728,7896146536,包括电话在内的所有值都被插入到 MYSQL 数据库表中,但同样的错误即将到来(仅适用于电话)。
  • 正如其他人指出的问题是该列的值太长。运行 DESCRIBE (dev.mysql.com/doc/refman/5.7/en/describe.html) 并发布结果以及正在执行的 INSERT 语句。

标签: java mysql sql


【解决方案1】:

这是你的问题:

'2112 峡谷大道'

在插入查询中。

insert into temp__final_table(Name,Address,Phone,EmpNo,Age,DeptNo) values ('Clerk#000000959','Skye Norling','2112 Ravine Drive','7091581728','Clerk#000000959','26')

您在电话字段中插入地址。

另外,'Clerk#000000959' 似乎是EmpNo。您似乎将其插入同一行的多个列中。

此外,建议在必要时使用numeric 字段。您的 DeptNo 看起来是整数类型的完美候选者。您不需要对所有列都使用 varchar。

希望对你有帮助!!!

【讨论】:

  • 请记住,使用整数类型会产生副作用,例如丢失前导零。仅仅因为某事只包含数字并不意味着它是一个数字(例如,邮政编码)。一个好的经验法则是,只有在你打算用它做数学运算时才把它当作一个数字。
猜你喜欢
  • 2014-02-26
  • 2022-11-26
  • 2017-01-30
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2014-09-28
  • 2021-09-02
  • 2012-11-14
相关资源
最近更新 更多