如何在Oracle中存储一个字节数组?

时间:2010-07-15 13:36:04

标签: c# sql oracle oracle10g

我想在Oracle数据库中存储一个64字节的短数组(密码哈希)。我认为char(64 byte)是我需要的,但似乎它不起作用。在Microsoft SQL中,我使用binaryvarbinary类型。我需要在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 个答案:

答案 0 :(得分:3)

在Oracle中,RAW数据类型适用于存储二进制值。

使用字符数据类型存储二进制数据的问题是这些值受字符集转换的约束。

如果客户端字符集与数据库字符集不匹配,则值可以进行转换。 (也就是说,一个编码中的二进制值表示特定字符​​,但该字符可以用另一个字符集中的不同二进制值表示。

使用字符数据类型,Oracle会保留“字符”值,而不是编码的二进制值。

如果要使用字符(例如CHAR或VARCHAR2)数据类型来存储二进制值,则确实需要将二进制值编码为纯文本,并存储和检索编码值。两种流行的二进制文本编码是十六进制和base64(uuencode)。

Oracle提供内置函数RAWTOHEX和HEXTORAW,用于将二进制(RAW数据类型)编码和解码为十六进制字符串(VARCHAR2数据类型)。

答案 1 :(得分:1)

blob外,Oracle还具有RAW数据类型

  

RAW是一种可变长度的数据类型   VARCHAR2

- Oracle 10g Release 2 Datatypes

RAW可以设置为最大2000个字节,LONG RAW的最大大小为2GB。

然而:

  

Oracle强烈建议您   将LONG RAW列转换为二进制   LOB(BLOB)列。 LOB列是   受制于的限制要少得多   LONG专栏。

答案 2 :(得分:1)

最佳解决方案是使用RAW数据类型,该数据类型用于存储二进制数据。但是,RAW数据作为十六进制值插入和检索,因此可能需要进行一些转换。

您也应该能够使用CHAR或VARCHAR2,但这些数据类型不会将字段限制为二进制数据。如果您告诉我们当您尝试插入CHAR列时收到的错误,我们可以帮助您解决这个问题......

请记住,如果使用CHAR数据类型,则CHAR值始终填充到字段的长度,因此在某些情况下使用它们之前可能需要修剪较小的值。