在我的Sybase 12.0 ASE数据库中,我有一个表,其中包含一个定义为二进制(16)的列,用于存储GUIDS/uuid。当我使用SQL客户端+ ansi SQL为该表运行选择查询时,一切看起来都很好..我可以看到guid值,因为我期望它在结果集中(guid看起来像这样"1ae5608d12311de123d001185135a13"在SQL输出)
然而,在代码中,当试图通过JDBC做到这一点时(我使用的是Sybase "com.sybase.jdbc3.jdbc. com.sybase.jdbc3.jdbc。SybDriver"driver"),当我遍历结果集并尝试读取该列时,它基本上作为垃圾返回。如果我执行resultset . getobject (col),其中col是我的结果集中的二进制列索引,我看到类型是byte[]。我已经尝试将其转换为字符串并编码为Base64,但无济于事。
有什么好主意吗?
谢谢
您收到的byte[]
正是它应该是什么:根据列定义,一个16字节或更少的序列。
您要创建的UID的什么表示形式?-它们通常不表示为Base64,而是十六进制。
尝试将byte[]
直接转换为String
肯定是而不是您想要的。
如果对数组进行迭代,将每个字节转换为其(2位!)十六进制表示(String),并将这些字符串连接为长度为32的字符串,则结果可能看起来更像您需要的。
如果您想使用java.util.UUID
,您应该分别从第一组和第二组8字节中构建两个long
值,以传递给构造函数。
在java.util.UUID
你可以找到:
/*
* Private constructor which uses a byte array to construct the new UUID.
*/
private UUID(byte[] data) {
long msb = 0;
long lsb = 0;
assert data.length == 16;
for (int i=0; i<8; i++)
msb = (msb << 8) | (data[i] & 0xff);
for (int i=8; i<16; i++)
lsb = (lsb << 8) | (data[i] & 0xff);
this.mostSigBits = msb;
this.leastSigBits = lsb;
}
我有没有知道为什么它不是public
…
给定byte[]
,可以用下面的代码为UUID(long,long
构造函数创建两个long
值。
你只需要注意从DB接收到的数组中字节的顺序;哪一个是最低有效的字节,哪一个是最高有效的字节。(可能是[0]和[15],或者[15]和[0])
一旦你有了UUID
的实例,你就可以使用它的toString()
来获得通用的表示。
如果你不想使用UUID
,你必须自己将字节转换为十六进制输出,也许插入一些破折号可读性