我有一个表 TestTable,其列 ID 为 binary(16),名称为 varchar(50)
我一直在尝试将有序的 UUID 存储为 PK,就像本文中一样以优化的方式存储 UUID https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
我看到 UUID 以十六进制(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呢?
UPDATE
我根据答案解决了我的问题大卫·埃尔曼 https://stackoverflow.com/a/40297651/2532403。但就我而言,我使用 tomcat 中的 HexUtils 将排序后的 UUID 字符串转换为 bytes[]:
byte[] final_id = HexUtils.fromHexString(partial_id);