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



在我的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,你必须自己将字节转换为十六进制输出,也许插入一些破折号可读性

相关内容

  • 没有找到相关文章

最新更新