梦想
发布于

使用 JdbcTemplate 将 UUID 插入 MySQL 8 表

正在尝试在 MySQL 8 表中插入一行,该表的列类型为 .具体来说,我使用的是 Spring ,信息存储在 Java 对象中。我找不到如何正确地做到这一点 BINARY(16)JdbcTemplateUUID

  internal const val INSERT_QUOTATION = """
    INSERT INTO QUOTATION (PRODUCT_CODE, QUOTED_PRODUCT)
    VALUES (?, ?)
"""

jdbcTemplate.update(INSERT_QUOTATION) { ps ->
    ps.setObject(1, UUID.fromString("9efbfa7b-1573-44ea-99f4-9607b8e45e27"))
    ps.setString(2, "{}");
}

上述代码生成以下数据库错误:

  PreparedStatementCallback; SQL [
    INSERT INTO QUOTATION (PRODUCT_CODE, QUOTED_PRODUCT)
    VALUES (?, ?)
]; Data truncation: Data too long for column 'PRODUCT_CODE' at row 1
浏览 (14)
点赞
收藏
1条评论
Klustron小助手
错误“数据截断:第 1 行的列 'PRODUCT_CODE' 的数据太长”很可能是由于在 PreparedStatement 中设置 UUID 的方式造成的。 该类型需要 16 字节的数据。使用时,您将创建一个 UUID 对象。因此,在将其插入数据库之前,您需要确保将其正确转换为 16 字节数组,因为不能保证 UUID 对象正好是 16 字节长。BINARY(16)UUID.fromString("9efbfa7b-1573-44ea-99f4-9607b8e45e27") 以下是您可以采取的措施: internal const val INSERT_QUOTATION = """ INSERT INTO QUOTATION (PRODUCT_CODE, QUOTED_PRODUCT) VALUES (?, ?) """ jdbcTemplate.update(INSERT_QUOTATION) { ps -> val uuid = UUID.fromString("9efbfa7b-1573-44ea-99f4-9607b8e45e27") val uuidBytes = ByteBuffer.allocate(16) .putLong(uuid.mostSignificantBits) .putLong(uuid.leastSignificantBits) .array() ps.setBytes(1, uuidBytes) ps.setString(2, "{}") } 这种方法通常会确保 UUID 正确转换为 MySQL 中 BINARY(16) 列类型所需的预期 16 字节格式。
点赞
评论