Java 查询 varbinary(64) 列的字符串

Java string to query a varbinary(64) column

对于单元测试,我需要在 MySQL table 中查询 varbinary(64) 列中的特定值。使用 jooq 从 csv 加载数据。

VARBIN_VALS,...
0001,...
0002,...

加载测试数据后,当我在 table 上 select 时,我看到值 0001。我想找到 VARBIN_VALS 0001 的记录,所以我试图从 java 字符串构造字节数组。我尝试了几种变体:

"0001".getBytes()
"0001".getBytes(StandardCharsets.UTF_8)
"0001".getBytes(Charsets.UTF_16)

但没有任何匹配项。据我所知 mysql 正在使用 utf8mb4。如何将 java 字符串转换为与 jooq 匹配的字节数组?

加载的测试数据:

ContextObject.loadInto(TABLE_A).
loadCSV(SourceFile).fields(...).execute();

查询是:

ctx.select(TABLE_A.FIELD_OF_INTEREST).
from(TABLE_A).
where(TABLE_A.VARBIN_FIELD.eq(bytesArray)).
fetch(TABLE_A.FIELD_OF_INTEREST);

尝试

byte[] varBinary = "0001".getBytes(StandardCharsets.UTF_8);

我认为这里发生的事情是:如果您的专栏是某种 byte[] 类型(例如 VARBINARY),那么 Loader API 将尝试解码 base64编码二进制数据,参见 https://github.com/jOOQ/jOOQ/issues/5858

在所有二进制字符串表示中,这似乎是最受欢迎的一种,但它可能不是您所期望的。您期望 jOOQ 将 String 直接传递给 JDBC 驱动程序。

在不久的将来可能会实现针对任意字符串编码的彻底解决方案,请参阅:https://github.com/jOOQ/jOOQ/issues/3221,您可以在其中定义显式 String 以在从 CSV 加载数据时自定义类型转换(或 JSON, 等等)

到此为止,我想问题就清楚了?现在,您应该:

  • 将 base64 编码的二进制数据放入 CSV 中
  • Pre-process 你的 CSV 并将二进制数据传递给 Object[]Record 表示,然后加载它,而不是