我有一个表 TestTable,其列 ID 为 binary(16),名称为 varchar(50)
我一直在尝试将有序的 UUID 存储为 PK,如本文以优化的方式存储 UUID
我看到 UUID 作为 HEX (blob) 保存在数据库中
所以我想从java中保存这个ID,但我收到了这个错误
数据截断:第 1 行的“ID”列的数据太长
我目前正在使用库 sql2o 与 mysql 交互
所以基本上这是我的代码
String suuid = UUID.randomUUID().toString();
String partial_id = suuid.substring(14,18) + suuid.substring(9, 13) + suuid.substring(0, 8) + suuid.substring(19, 23) + suuid.substring(24)
String final_id = String.format("%040x", new BigInteger(1, partial_id.getBytes()));
con.createQuery("INSERT INTO TestTable(ID, Name) VALUES(:id, :name)")
.addParameter("id", final_id)
.addParameter("name", "test1").executeUpdate();
部分 id 应该是这样的11d8eebc58e0a7d796690800200c9a66
我在mysql中试过这个语句没有问题
insert into testtable(id, name) values(UNHEX(CONCAT(SUBSTR(uuid(), 15, 4),SUBSTR(uuid(), 10, 4),SUBSTR(uuid(), 1, 8),SUBSTR(uuid(), 20, 4),SUBSTR(uuid(), 25))), 'Test2');
但是当我删除 unhex 函数时,我得到了同样的错误。那么如何将正确的 ID 从 Java 发送到 mysql?
更新
我在David Ehrmann的回答的启发下解决了我的问题。但在我的例子中,我使用了来自 tomcat 的 HexUtils 将排序后的 UUID 字符串转换为字节 []:
byte[] final_id = HexUtils.fromHexString(partial_id);