Как хранить массив байтов в Oracle? - PullRequest
0 голосов
/ 15 июля 2010

Я хочу сохранить короткий массив из 64 байтов в базе данных Oracle (хэш пароля).Я думал, что char(64 byte) - это то, что мне нужно, но, похоже, это не работает.В Microsoft SQL я использую типы binary и varbinary.Какой тип мне нужно использовать в Oracle?

Каждый найденный мной пример использует blob для хранения двоичных данных, но я полагаю, blob предназначен только для больших объектов, а не для коротких массивов фиксированного размера.

При обновлении данных подходит ли такой код:

byte[] passwordHash = GenerateHash();

using (OracleCommand updateHash = new OracleCommand("update A set passwordHash = :hash where EntryId = :id", oracleConnection))
{
    updateHash.Parameters.Add(":hash", passwordHash);
    updateHash.Parameters.Add(":id", entryId);

    if (updateHash.ExecuteNonQuery() != 1)
    {
        // ...
    }
}

или я что-то упустил и параметры байтового массива не могут быть добавлены следующим образом?

Ответы [ 3 ]

3 голосов
/ 15 июля 2010

В Oracle тип данных RAW подходит для хранения двоичных значений.

Проблема с использованием типов данных символов для хранения двоичных данных заключается в том, что значения подчиняются преобразованию набора символов .

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

С типом данных символов Oracle сохраняет значение "символа", а незакодированное двоичное значение.

Если вы хотите использовать символьный тип данных (например, CHAR или VARCHAR2) для хранения двоичных значений, то вам действительно необходимо закодировать двоичное значение в виде простого текста, а также сохранить и извлечь закодированное значение. Двумя популярными кодировками двоичного текста являются шестнадцатеричные и base64 (uuencode).

Oracle предоставляет встроенные функции RAWTOHEX и HEXTORAW для кодирования и декодирования двоичных данных (тип данных RAW) в виде шестнадцатеричных строк (тип данных VARCHAR2).

1 голос
/ 15 июля 2010

Лучшее решение - использовать тип данных RAW, который предназначен для хранения двоичных данных.Однако данные RAW вставляются и извлекаются как шестнадцатеричные значения, поэтому может потребоваться некоторое преобразование.

Вы также можете использовать CHAR или VARCHAR2, но эти типы данных не будут ограничивать поле только двоичными данными.Если вы сообщите нам, какую ошибку вы получили, когда пытались вставить ее в столбец CHAR, мы можем помочь вам разобраться с этим ...

Имейте в виду, что если вы используете тип данных CHAR, этоЗначения CHAR всегда дополняются до длины поля, поэтому вам может потребоваться обрезать меньшие значения, прежде чем использовать их в некоторых случаях.

1 голос
/ 15 июля 2010

В дополнение к blob Oracle также имеет тип данных RAW,

RAW - это тип данных переменной длины VARCHAR2

- Типы данных Oracle 10g Release 2

RAW может быть установлен до максимального размера 2000 байт, при этом LONG RAW имеет максимальный размер 2 ГБ.

Тем не менее:

Oracle настоятельно рекомендует вам конвертировать LONG RAW столбцы в двоичный LOB (BLOB) столбцы. LOB столбцы подлежит гораздо меньшим ограничениям, чем Длинные столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...