Чтение GUID как строки из таблицы Sybase с использованием JDBC - PullRequest
0 голосов
/ 29 октября 2011

В моей базе данных Sybase 12.0 ASE у меня есть таблица, которая содержит столбец, определенный как двоичный (16) и используемый для хранения идентификаторов GUIDS / UUID. Когда я запускаю запрос на выборку, используя SQL-клиент + ANSI SQL для этой таблицы, все выглядит нормально ... я могу видеть значение guid, как я ожидаю, в наборе результатов (guid выглядит примерно так "1ae5608d12311de123d001185135a13" в выводе sql)

Однако в коде при попытке сделать это через JDBC (я использую драйвер Sybase "com.sybase.jdbc3.jdbc.SybDriver"), когда я перебираю набор результатов и пытаюсь прочитать этот столбец, он возвращается как в основном фигня. если я делаю ResultSet.getObject (col), где col - это двоичный индекс столбца в моем наборе результатов, я вижу, что это тип byte []. Я попытался преобразовать это в строку и кодировать как Base64, но безрезультатно.

Есть идеи, как это сделать?

Спасибо

1 Ответ

2 голосов
/ 29 октября 2011

Полученное byte[] - это именно то, что и должно быть: последовательность из 16 байтов или меньше, в соответствии с определением столбца.

Какое представление UID вы пытаетесь создать? - Они обычно представлены не как Base64, а как Hex.

Попытка преобразовать byte[] в String напрямую, безусловно, не , что вы хотите.
Если вы выполните итерацию по массиву, конвертируя каждый байт в его (2-значное!) Шестнадцатеричное представление (String) и объединяете эти строки в строку длиной 32, результат, вероятно, будет выглядеть намного больше, чем вам нужно. *

Если вы хотите использовать java.util.UUID, вы должны построить два значения long из первого и второго набора из восьми байтов, соответственно, для передачи конструктору.

Edit:

В 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, именно с этим кодом.

Вам нужно будет только обратить внимание на порядок байтов в массиве, который вы получаете из БД; который является младшим значащим байтом , который является старшим значащим байтом . (Возможно, либо [0] и [15], либо [15] и [0].)

Если у вас есть экземпляр UUID, вы можете использовать его toString(), чтобы получить общее представление.

Если вы не хотите использовать UUID, вам придется конвертировать байты в шестнадцатеричный код для вывода и, возможно, вставить несколько черточек для удобства чтения.

...