代码之家  ›  专栏  ›  技术社区  ›  Arseni Mourzenko

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

  •  0
  • Arseni Mourzenko  · 技术社区  · 15 年前

    我想在Oracle数据库中存储一个64字节的短数组(密码哈希)。我想 char(64 byte) 这是我需要的,但似乎不起作用。在Microsoft SQL中,我使用 binary varbinary 类型。我需要在Oracle中使用哪种类型?

    我发现的每个示例都使用 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 回复  |  直到 14 年前
        1
  •  1
  •   Powerlord    15 年前

    除了 blob ,Oracle也有 RAW 数据类型,

    raw是一个可变长度的数据类型 瓦尔加尔

    —— Oracle 10g Release 2 Datatypes

    RAW最大可设置为2000字节,使用 LONG RAW 最大容量为2GB的。

    然而:

    Oracle强烈建议您 将长的原始列转换为二进制 LOB(BLOB)列。Lob列是 受到的限制远少于 长柱。

        2
  •  3
  •   spencer7593    14 年前

    在Oracle中,原始数据类型适合存储二进制值。

    使用字符数据类型存储二进制数据的问题是,这些值要服从 字符集转换 .

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

    对于字符数据类型,Oracle保留“character”值,而不是编码的二进制值。

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

    Oracle提供了内置函数rawtohex和hextoraw,用于将二进制(原始数据类型)编码和解码为十六进制字符串(varchar2数据类型)。

        3
  •  1
  •   Allan    15 年前

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

    您还应该能够使用char或varchar2,但是这些数据类型不会将字段约束为仅限二进制数据。如果您告诉我们您在尝试插入char列时收到了什么错误,我们可能可以帮助您解决这个问题…

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