MySQL 抛出“java.sql.SQLException:列计数与第 1 行的值计数不匹配”[重复]

Posted

技术标签:

【中文标题】MySQL 抛出“java.sql.SQLException:列计数与第 1 行的值计数不匹配”[重复]【英文标题】:MySQL throws "java.sql.SQLException: Column count doesn't match value count at row 1" [duplicate] 【发布时间】:2018-04-17 17:18:42 【问题描述】:
String QueryText= "INSERT INTO user_details (fname,lname,user_email,birth_day,birth_mnth,birth_year,addr,pwd) VALUES ('"+fname+"','"+lname+"','"+user_email+"','"+birth_day+"','"+birth_mnth+"','"+birth_year+"','"+gender+"','"+addr+"','"+pwd+"')";

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdatabase", "root","");

Statement st=con.createStatement();

int rt = st.executeUpdate(QueryText);

【问题讨论】:

好吧,8 != 9 ... 学习使用参数。这可以防止各种问题。而且,它们使代码更易于阅读和更新。 【参考方案1】:

为了避免这种性别和 SQL 注入的问题,最好使用 PreparedStatement 代替:

String queryText = "INSERT INTO user_details "
      + "(fname, lname, user_email, birth_day, birth_mnth, birth_year, gender, addr, pwd) "
      //----------------------------------------------------------------^
      + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";

Connection con = DriverManager.getConnection(
                      "jdbc:mysql://localhost:3306/jspdatabase", "root", "");

try(PreparedStatement pst = con.prepareStatement(queryText);)
    pst.setString(1, fname);
    pst.setString(2, lname);
    pst.setString(3, user_email);
    pst.setString(4, birth_day);   //If one of the three is integer type
    pst.setString(5, birth_mnth);  //You have to use setInt(...) instead
    pst.setString(6, birth_year);  //of setString(...)
    pst.setString(7, gender);
    pst.setString(8, addr);
    pst.setString(9, pwd);
    int rt = pst.executeUpdate();
    ...


真正的问题是您使用 8 个参数并尝试插入 9 个值,这就是您收到此错误的原因。

【讨论】:

【参考方案2】:

很明显,列数与您提供的值不匹配。

您声明 8 列并提供 9 个值。

您的列中未声明性别

【讨论】:

以上是关于MySQL 抛出“java.sql.SQLException:列计数与第 1 行的值计数不匹配”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

谁在抛出(并捕获)这个 MySQL 异常?

MySQL/MariaDB 配置警告以抛出错误

mysql插入存储过程抛出错误

关于mysql连接抛出10038错误问题

mysql过程抛出错误

重新抛出非 MySQL 错误 Node.js