【问题标题】:How to store an array of bytes in Oracle?如何在 Oracle 中存储字节数组?
【发布时间】:2010-07-15 13:36:03
【问题描述】:

我想在 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)
    {
        // ...
    }
}

还是我遗漏了什么,不能像这样添加字节数组参数?

【问题讨论】:

    标签: c# sql oracle oracle10g


    【解决方案1】:

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

    使用字符数据类型存储二进制数据的问题在于,这些值需要进行字符集转换

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      RAW 是一种可变长度数据类型,例如 VARCHAR2

      -- Oracle 10g Release 2 Datatypes

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

      但是:

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

      【讨论】:

        【解决方案3】:

        最好的解决方案是使用 RAW 数据类型,它旨在存储二进制数据。但是 RAW 数据以十六进制值的形式插入和检索,因此可能需要进行一些转换。

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

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

        【讨论】:

          猜你喜欢
          • 2016-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-31
          • 1970-01-01
          • 2018-11-15
          相关资源
          最近更新 更多