java - Firebird CHAR_TO_UUID,因 GDS 异常而失败。 335544606

标签 java jdbc firebird jaybird

第一个背景。

我正在使用 Java 作为 Eclipse RCP (efxclipse) 编写桌面应用程序。 我的配置:

  • eclipse 火星
  • efxclipse 2.0.0
  • JDK 1.8_66
  • Equinox OSGi 框架
  • Firebird 2.5.5.26952
  • Jaybird 2.2.9
  • HicariCP 2.4.1 作为连接池解决方案

数据库表示例:

CREATE TABLE MYTABLE (
    ID  CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS NOT NULL CONSTRAINT PK_MY_INDEX PRIMARY KEY,
    DATA VARCHAR(100)
);

HikariCP 设置为

HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(100);
config.setDataSourceClassName("org.firebirdsql.pool.FBSimpleDataSource");
config.addDataSourceProperty("databaseName", cfg.getDbConnection());
config.addDataSourceProperty("user", cfg.getDbUser());
config.addDataSourceProperty("password", cfg.getDbPassword());
config.addDataSourceProperty("encoding", "UTF8"); 
//config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");
config.setMaximumPoolSize(cfg.getDbPoolSizeMax());

HikariDataSource ds = new HikariDataSource(config);
ds.setConnectionTimeout(5000);      

//我使用 UUID 作为主键,为了获取行,我使用如下代码

Connection con = ds.getConnection();
query = "SELECT DATA FROM MYTABLE WHERE ID=char_to_uuid(?)";
PreparedStatement p = con.prepareStatement(query);
p.setString(1, id);

其中“id”是字符串,其值类似于 '57F2B8C7-E1D8-4B61-9086-C66D1794F2D9'

直到上周我在我的电脑上使用 Firebird 2.5.2xxx 和 Jaybird 2.2.8,这个设置绝对没有问题。然后我将我的 firebird 安装升级到版本 2.5.5.26952 并出现问题。

问题:

升级到 Firebird 2.5.5 代码部分后,我获取已知“id”的行抛出异常

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544606. expression evaluation not supported
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36
    at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:782) ~[na:na]
    at org.firebirdsql.jdbc.AbstractPreparedStatement.executeQuery(AbstractPreparedStatement.java:177) ~[na:na]
    at com.zaxxer.hikari.proxy.PreparedStatementProxy.executeQuery(PreparedStatementProxy.java:52) ~[na:na]
    at com.zaxxer.hikari.proxy.HikariPreparedStatementProxy.executeQuery(HikariPreparedStatementProxy.java) ~[na:na]
...
Caused by: org.firebirdsql.gds.GDSException: expression evaluation not supported
Human readable UUID argument for CHAR_TO_UUID must be of exact length 36
    at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.readStatusVector(AbstractJavaGDSImpl.java:2092) ~[na:na]
    at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.receiveResponse(AbstractJavaGDSImpl.java:2042) ~[na:na]
    at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlExecute2(AbstractJavaGDSImpl.java:1149) ~[na:na]
    at org.firebirdsql.gds.impl.GDSHelper.executeStatement(GDSHelper.java:232) ~[na:na]
    at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:774) ~[na:na]

“id”的值是 36 个字符长度的字符串(我检查过,它一直工作到上周)。我已经切换到 Jaybird 2.2.9 问题仍然存在。 据我所知,这与将参数值作为 UTF8 字符串(长度 x 4)发送有关,因此我更改了我的代码,如下所示:

p.setObject(1, id.getBytes(StandardCharsets.US_ASCII));

同样,没有结果,同样的问题。

此外,这可能与 Jaybird 连接参数 octetsAsBytes 有关,但我无法正确应用它(通过 HikariCP)。 我试过了

config.addDataSourceProperty("nonStandardProperty", "?octetsAsBytes=true?");

在 HikariCP 设置中,但结果没有改变。

提前致谢。

最佳答案

我可以在 Firebird 2.5.4、2.5.5 和 Firebird 3 的最新快照(2.5.3 及更早版本似乎未受影响)中重现此问题。我已经能够重现这个,问题似乎出在 Firebird 本身。

如前所述,解决方法是将参数转换为显式字符集:

char_to_uuid(cast(? as char(36) character set utf8))

我已经在 Firebird 跟踪器中创建了一个票据来报告这个:CORE-5062 , 并将在 Firebird 2.5.6 和 Firebird 3 RC2 中修复

关于java - Firebird CHAR_TO_UUID,因 GDS 异常而失败。 335544606,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532398/

相关文章:

c++ - Firebird /IBPP : How to retrieve ID generated by a database autoincrement?

jdbc - BIRT 报告设计器空数据集脚本

java - 使用 JDBC 连接 MySQL 时访问被拒绝

c - Firebird 数据库连接凭据

java - 在java中使用嵌套泛型时出现奇怪的结果

java - 在 forEach 循环之外使用变量

java - File.renameTo() 失败

Javadoc @link 不同的返回类型

java - OSGI 捆绑错误 - ojdbc6.jar

sql - 如何在 Firebird 中删除唯一约束