You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DB Rider的YAML配置中正确表示字节数组

在YAML数据集(Database Rider + H2)中正确表示字节数组的方法

问题原因

你当前YAML里的\x4c6f72656d20697073756d写法无法被正确解析,是因为YAML的\x转义仅针对单个ASCII字符(比如\x4c会被解析为字符L),整段十六进制字符串会被当作普通文本存入数据库,rs.getBytes读取的是这段文本的字节,自然和你预期的二进制数据不符。

可行解决方案

1. 使用Base64编码(最通用)

将目标字节数组转换为Base64字符串,直接写入YAML即可。Database Rider会自动识别Base64字符串并转换为二进制数据存入对应字段。

比如"Lorem ipsum"的Base64编码是TG9yZW0gaXBzdW0=,修改YAML如下:

categories:
  - id: 1
    name: "Beverages"
    description: "Soft drinks, coffees, teas, beers, and ales"
    picture: TG9yZW0gaXBzdW0= # Base64编码的"Lorem ipsum"

测试代码中的断言无需修改,rs.getBytes会正确读取到预期的字节数组。

2. 使用H2的二进制字面量语法

H2支持用X'十六进制内容'表示二进制数据,直接在YAML中使用该语法,Database Rider会将其作为SQL原生值插入数据库:

categories:
  - id: 1
    name: "Beverages"
    description: "Soft drinks, coffees, teas, beers, and ales"
    picture: X'4C6F72656D20697073756D'

这种写法直接贴合H2的二进制类型语法,无需额外编码转换。

3. 自定义类型转换器(兼容原有十六进制写法)

如果需要保留YAML中的十六进制格式,可以给Database Rider添加自定义类型转换器,将十六进制字符串转为byte[]:

首先实现转换器:

import javax.persistence.AttributeConverter;
import java.util.Locale;

public class HexStringToByteArrayConverter implements AttributeConverter<String, byte[]> {

    @Override
    public byte[] convertToDatabaseColumn(String hexStr) {
        if (hexStr == null || hexStr.isBlank()) {
            return null;
        }
        // 去除可能的\x前缀
        String cleanHex = hexStr.startsWith("\\x") ? hexStr.substring(2) : hexStr;
        cleanHex = cleanHex.replaceAll("\\s+", "").toUpperCase(Locale.ROOT);
        
        int length = cleanHex.length();
        byte[] result = new byte[length / 2];
        for (int i = 0; i < length; i += 2) {
            result[i / 2] = (byte) ((Character.digit(cleanHex.charAt(i), 16) << 4)
                    + Character.digit(cleanHex.charAt(i + 1), 16));
        }
        return result;
    }

    @Override
    public String convertToEntityAttribute(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder("\\x");
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
}

然后在测试类上配置该转换器:

@DBRider
@ExtendWith(SpringExtension.class)
@DataSet(
    value = "categories.yml",
    transformers = @DataSetTransformer(
        transformer = TypeTransformer.class,
        converters = HexStringToByteArrayConverter.class
    )
)
class CategoryJdbcTest {
    // 测试代码不变
}

之后你原来YAML中的\x4c6f72656d20697073756d写法就能被正确解析为目标字节数组。

内容的提问来源于stack exchange,提问作者user4695271

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:27:44