我有一个表TestTable,列ID为二进制(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');但是当我移除解十六进制函数时,我得到了同样的错误。那么,如何将正确的ID从Java发送到mysql呢?
更新
我从戴维·埃尔曼的回答中解决了我的问题。但在我的示例中,我使用tomcat的HexUtils将已排序的UUID字符串转换为bytes[]:
byte[] final_id = HexUtils.fromHexString(partial_id);发布于 2016-10-28 03:35:31
尝试将其存储为字节:
UUID uuid = UUID.randomUUID();
byte[] uuidBytes = new byte[16];
ByteBuffer.wrap(uuidBytes)
.order(ByteOrder.BIG_ENDIAN)
.putLong(uuid.getMostSignificantBits())
.putLong(uuid.getLeastSignificantBits());
con.createQuery("INSERT INTO TestTable(ID, Name) VALUES(:id, :name)")
.addParameter("id", uuidBytes)
.addParameter("name", "test1").executeUpdate();有一点解释:您的表使用二进制(16),因此将UUID序列化为其原始字节是一种非常简单的方法。UUID本质上是128位int,有几个保留位,所以这段代码将其写成一个大端128位int。ByteBuffer只是将两个longs转换成一个字节数组的简单方法。
现在,在实践中,所有的转换工作和头痛将不值得您节省每一行20个字节。
https://stackoverflow.com/questions/40297600
复制相似问题