在我的Sybase 12.0 ASE数据库中,我的表包含一个定义为二进制(16)的列,用于存储GUIDS / UUID。当我使用SQL客户端+ ansi SQL为该表运行选择查询时,所有看起来都很好..我可以看到guid值,因为我期望它在结果集中(guid在sql输出中看起来像这样的“1ae5608d12311de123d001185135a13”)
但是在代码中尝试通过JDBC执行此操作时(我使用Sybase“com.sybase.jdbc3.jdbc.SybDriver”驱动程序),当我遍历结果集并尝试读取该列时,它会返回基本上是垃圾。如果我执行ResultSet.getObject(col),其中col是我的结果集中的二进制列索引,我看到类型是byte []。我已经尝试将其转换为字符串并编码为Base64,但无济于事。
关于如何做到这一点的任何想法?
由于
答案 0 :(得分:2)
根据列定义,您收到的byte[]
正是它应该是:16字节或更少的序列。
您尝试创建的UID代表什么? - 它们通常不代表Base64,而是代表Hex。
尝试直接将byte[]
转换为String
肯定是而不是你想要的。
如果迭代数组,将每个字节转换为其(2位数!)十六进制表示(String),并将这些字符串连接到长度为32的字符串,结果可能看起来更像你需要的。
如果你想使用java.util.UUID
,你应该分别从第一组和第二组八个字节构建两个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[]
,您可以使用此代码创建long
构造函数所需的两个UUID(long,long
值。
您只需要注意从DB收到的数组中字节的顺序;哪一个是最低有效字节,它是最高有效字节。 (可能是[0]和[15],或[15]和[0]。)
如果您拥有UUID
的实例,则可以使用其toString()
来获取常见代表。
如果您不想使用UUID
,您必须自己将字节转换为十六进制以输出,并可能插入一些破折号以便于阅读。