升级Ignite至2.11.1后查询数据库报十六进制字符串异常求助
Ignite 2.7.6升级至2.11.1后SQL查询异常问题
我们将Ignite服务器从2.7.6版本升级至2.11.1版本后,执行SELECT * FROM EMPLOYEE WHERE EMPLOYEE_ID IN (?)查询时出现如下异常:
[2023-01-18T04:56:14,637][ERROR][client-connector-#143][JdbcRequestHandler] Failed to execute SQL query [reqId=29, req=JdbcQueryExecuteRequest [schemaName=PUBLIC, pageSize=1024, maxRows=0, sqlQry=SELECT * FROM EMPLOYEE WHERE EMPLOYEE_ID IN (?), args=Object[] [1], stmtType=SELECT_STATEMENT_TYPE, autoCommit=true, partResReq=false, explicitTimeout=false, super=JdbcRequest [type=2, reqId=29]]] javax.cache.CacheException: class org.apache.ignite.internal.processors.query.IgniteSQLException: General error: "class org.apache.ignite.IgniteCheckedException: Runtime failure on lookup row: IndexSearchRowImpl [rowHnd=org.apache.ignite.internal.processors.query.h2.index.QueryIndexRowHandler@5b289c8e]"; SQL statement: SELECT * FROM EMPLOYEE WHERE EMPLOYEE_ID IN (?) [50000-197] . . . Caused by: org.apache.ignite.IgniteCheckedException: Rows cannot be compared . . . Caused by: org.h2.message.DbException: Hexadecimal string with odd number of characters: "1" [90003-197]
可能的原因及解决建议
数据类型不匹配
异常信息Hexadecimal string with odd number of characters: "1"指向核心问题:EMPLOYEE_ID字段的数据格式与查询参数不兼容。Ignite 2.11.1内置的H2引擎对数据类型校验更严格,若原2.7.6版本中该字段存储为十六进制字符串,升级后传入数值类型参数(如1)会触发转换错误。检查表结构与数据
确认EMPLOYEE表的EMPLOYEE_ID字段定义:- 若字段应为数值类型(如INT),排查现有数据中是否存在十六进制格式的无效值,清理或修正这类数据;
- 若字段为字符串类型,确保查询参数传入偶数长度的十六进制格式字符串(如
"01"而非"1")。
调整参数绑定逻辑
检查JDBC客户端的参数绑定代码,确保传入IN (?)的参数类型与表字段类型完全匹配:- 字段为数值类型时,以数值类型绑定参数,避免转为字符串;
- 字段为字符串类型时,将数值参数转换为符合要求的十六进制格式字符串后再传入。
重建索引与数据兼容处理
Ignite 2.7到2.11版本间SQL引擎有较大更新,可尝试重建EMPLOYEE_ID相关索引,执行REBUILD INDEX语句;或导出全量数据后重新导入,确保数据格式适配新版本的校验规则。
内容的提问来源于stack exchange,提问作者sushil
相关产品推荐
相关产品推荐

