Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奇怪的SQLException:找不到列_Java_Mysql_Sqlexception - Fatal编程技术网

Java 奇怪的SQLException:找不到列

Java 奇怪的SQLException:找不到列,java,mysql,sqlexception,Java,Mysql,Sqlexception,我在使用JDBC对数据库运行的函数上遇到了一个奇怪的SQLException。 SQLException:未找到“消息”列 我的职能是: st=con.prepareStatement(“选择NotificationID、UserIDFrom、UserIDTo、Message、Timestamp、isNotified FROM notification,其中UserIDTo=?和isNotified=?”; st.setInt(1,_UserID); st.setBoolean(2,假); Sy

我在使用JDBC对数据库运行的函数上遇到了一个奇怪的SQLException。 SQLException:未找到“消息”列

我的职能是:

st=con.prepareStatement(“选择NotificationID、UserIDFrom、UserIDTo、Message、Timestamp、isNotified FROM notification,其中UserIDTo=?和isNotified=?”;
st.setInt(1,_UserID);
st.setBoolean(2,假);
System.out.println(“st为:+st”);
rs=圣执行机构();
我得到了那个错误,所以我在
st.executeQuery()之后添加了这个:

ResultSetMetaData meta=rs.getMetaData();

对于(int index=1;index将isNotified列的数据类型更改为数据库中的TINYINT,然后重试插入

isNotified TINYINT(1)

Bool,Boolean:这些类型是TINYINT(1)的同义词。零值被视为false。非零值被视为true。

如果您观察代码

try {
        time = rs.getString("Timestamp");
        System.out.println("time: " + time);
    } catch (Exception e) {
        System.out.println("Timestamp error: " + e);
        e.printStackTrace();
    }
}
您在这种格式中使用了“Timestamp”,但如果您将其更改为数据库中指定的“Timestamp”,希望它能正常工作。

您能更改吗

System.out.println("Column " + index + " is named " + meta.getColumnName(index));

这样我们就可以看到“Message”列名中是否有空格了

我认为,错误消息出现在第5列和第6列之间这一事实并不重要,因为一个是标准输出,另一个是标准错误,它们不是同步的输出流


(另请参见前面关于时间戳与时间戳的回答。)

听起来表元数据已损坏。您应该能够通过删除并重新创建表来纠正此问题,尽管如果元数据确实损坏,您可能无法删除表。如果是这种情况,或者您需要保留数据,备份和恢复整个数据库是可行的方法,但请检查SQL转储文件b在删除损坏的数据库之前,请先还原和/或还原到另一个数据库名称。根据具体的错误,转储中可能缺少问题列


如果不选择刷新数据库,则有一些方法可以执行有针对性的修复,但我不是专家,因此无法就此向您提供建议。再次备份数据库并验证备份是否完整(即,它包含所有列)在继续之前。如果这是一个生产数据库,我会非常小心地从互联网上获取有关操作元数据的建议。版本、存储引擎和环境的细微差异可能会影响您的操作,并且鉴于问题的性质,您不能进行试运行。

您有任何触发器吗?您有吗如果在SQL语句中手动设置Int/Boolean,则会出现错误?例如,尝试“从通知中选择*,其中UserIDTo=1,isNotified=0”并在不设置PreparedStatement变量的情况下执行它。列名中是否有一些空格或奇怪的字符?@abmitchell我已经按照您所说的方式尝试过了,但仍然遇到了相同的错误我建议您调试jdbc代码,以找出引发异常的位置,并尝试跟踪未达到预期效果的比较成功。问题可能出在您的代码/配置中,但调试到jdbc将帮助您了解哪些不符合要求。我在数据类型中没有看到布尔选项,在MySQL EDIT btw中,我在另一个表中有相同类型的字段,并且我使用了'setBoolean()'在我的java代码中,它可以很好地工作,您使用的是哪个版本的MSQL?不确定您为什么建议这样做,我到处使用Bit(1),并且没有出现问题。从MySQL命令行:服务器版本:5.6.13-log MySQL社区服务器(GPL)
System.out.println("Column " + index + " is named '" + meta.getColumnName(index) + "'");