Firebird CHAR_TO_UUID,失败,出现GDS异常.335544606



第一个背景。

我正在用Java将桌面应用程序编码为EclipseRCP(efxclipse)。我的配置:

  • 月食火星
  • efxclipse 2.0.0
  • JDK 1.8_66
  • Equinox OSGi框架
  • 火鸟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);

其中,is"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字符串(长度x4)有关,所以我修改了代码,如下所示:

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

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

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

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

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

提前谢谢。

我可以在火鸟2.5.4、2.5.5和火鸟3的最新快照中复制这一点(2.5.3和更早版本似乎未受影响)。我已经能够复制这一点,而问题似乎出在火鸟身上。

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

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

我已经在火鸟跟踪器中创建了一个票证来报告这一点:CORE-5062,它将在火鸟2.5.6和火鸟3 RC2 中修复

相关内容

  • 没有找到相关文章

最新更新