You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

java.sql.SQLException: 行1列值数量不匹配错误排查求助

解决java.sql.SQLException: Column count doesn't match value count at row 1错误

给你几个直接的排查方向和解决方案:

1. 输入含特殊字符导致SQL语法变形

你当前用Statement直接拼接字符串,如果用户输入内容里有单引号(比如名字是O'Conner),拼接后的SQL会变成:

INSERT INTO user (full_name, phone_number, password, email) VALUES ('O'Conner','12345','xxx','xxx@xxx.com')

这里的单引号会提前闭合字符串,导致后续内容被误判为新参数,直接打乱值的数量,触发列数不匹配错误。

解决办法:立刻改用PreparedStatement,彻底解决这个问题同时防范SQL注入:

String nam = name.getText();
String number = num.getText();
String pass = password.getText();
String mail = email.getText();
try{
    String sql = "INSERT INTO user (full_name, phone_number, password, email) VALUES (?,?,?,?)";
    PreparedStatement ps = db.mycon().prepareStatement(sql);
    ps.setString(1, nam);
    ps.setString(2, number);
    ps.setString(3, pass);
    ps.setString(4, mail);
    ps.executeUpdate();
    
    Success SuccessFrame = new Success();
    SuccessFrame.setVisible(true);
    SuccessFrame.pack();
    SuccessFrame.setLocationRelativeTo(null);
    this.dispose();
} catch (Exception e){
    e.printStackTrace(); // 别只打印异常对象,打印堆栈能看到更多细节
}

2. 数据库表结构和预期不符

检查你的user表,是否存在非空且无默认值的其他列(比如id未设置自增、create_time这类必填字段)。如果有这类列,当前INSERT语句未给它们赋值,数据库会判定列数与值数量不匹配。

解决办法:

  • 要么在INSERT语句中补充这些列和对应值(比如id是自增则确保表结构已设置自增;手动赋值则添加id列和对应值);
  • 要么修改表结构,给这类列设置默认值或允许为空。

3. 打印实际执行的SQL排查语法问题

如果前两个方法没解决,在执行前把拼接好的SQL打印出来,看实际生成的语句是否有语法错误:

String sql = "INSERT INTO user (full_name, phone_number, password, email) VALUES ('"+nam+"','"+number+"','"+pass+"','"+mail+"')";
System.out.println("实际执行的SQL:" + sql); // 打印后检查是否有少引号、多逗号等问题
s.executeUpdate(sql);

内容的提问来源于stack exchange,提问作者Dave Franc Vergara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:17:19