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

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

或者我错过了什么,字节数组参数不能像这样添加?

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

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

– Oracle 10g第2版数据类型

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

然而:

Oracle强烈建议您将LONG RAW列转换为二进制LOB(BLOB)列。 与LONG列相比,LOB列的限制要少得多。

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

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

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

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

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

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

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

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

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