Snowflake JDBC插入字符串报错:数值'On Board'无法识别求助
先明确报错信息:
Caused by: net.snowflake.client.jdbc.SnowflakeSQLException: Numeric value 'On Board' is not recognized
手动执行正常但代码报错,可从以下几个方向排查解决:
强制指定参数SQL类型,避免驱动自动推断错误
Snowflake JDBC驱动有时会对字符串做错误的类型推断,即使值完全不具备数值特征。使用PreparedStatement时,不要依赖自动类型绑定,明确调用setString()或指定类型的setObject():// 直接绑定字符串类型 preparedStatement.setString(1, "On Board"); // 或显式指定VARCHAR类型 preparedStatement.setObject(1, "On Board", java.sql.Types.VARCHAR);避免直接使用不带类型参数的
setObject(index, value),防止驱动误将字符串识别为数值类型。确认目标列的实际数据类型
即使你认为列是String类型,也可能实际被定义为数值类型(比如NUMBER/INT)。执行以下SQL确认列类型:DESC TABLE your_target_table;检查目标列的
TYPE字段是否为VARCHAR/STRING类类型。检查参数绑定顺序是否匹配SQL语句
批量插入或多参数场景下,容易出现参数顺序错误,导致字符串被插入到数值列的位置。对比代码中PreparedStatement的参数索引和SQL语句里的占位符?顺序,确保一一对应。比如SQL是INSERT INTO tbl(num_col, str_col) VALUES(?, ?),若代码把字符串绑定到第一个参数,就会触发该错误。升级Snowflake JDBC驱动版本
旧版本驱动存在类型推断的bug,升级到最新稳定版可解决这类问题。以Maven依赖为例:<dependency> <groupId>net.snowflake</groupId> <artifactId>snowflake-jdbc</artifactId> <version>3.13.30</version> </dependency>
内容的提问来源于stack exchange,提问作者John Humanyun

