使用JDBC从Sybase Table读取GUID作为字符串

时间:2011-10-29 00:46:39

标签: sql guid uuid sybase-ase

在我的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,但无济于事。

关于如何做到这一点的任何想法?

由于

1 个答案:

答案 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,您必须自己将字节转换为十六进制以输出,并可能插入一些破折号以便于阅读。