2010-07-15 43 views
0

我想在Oracle數據庫中存儲一個64字節的簡短數組(密碼哈希)。我認爲char(64 byte)是我需要的,但它似乎不起作用。在Microsoft SQL中,我使用binaryvarbinary類型。我需要在Oracle中使用哪種類型?如何在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) 
    { 
     // ... 
    } 
} 

還是我失去了一些東西,字節數組參數不能這樣被添加?

回答

1

除了blob,Oracle還具有RAW數據類型,

RAW是一個可變長度的數據類型等 VARCHAR2

- Oracle 10g Release 2 Datatypes

RAW可設置到2000字節的最大尺寸,其中LONG RAW的最大尺寸爲2GB。

但是:

Oracle強烈建議您 LONG RAW列轉換爲二進制 LOB(BLOB)列。 LOB列是 ,但受到的限制要少於 LONG列。

1

最好的解決方案是使用RAW數據類型,它旨在存儲二進制數據。但是,RAW數據是作爲十六進制值插入和檢索的,因此可能需要進行一些轉換。

您應該也可以使用CHAR或VARCHAR2,但這些數據類型不會將字段限制爲二進制數據。如果您告訴我們您嘗試插入到CHAR列時收到的錯誤,我們可能會幫助您解決這個問題......

請記住,如果您使用CHAR數據類型,那麼CHAR值總是填充到字段的長度,所以在某些情況下使用它們之前,您可能需要修剪較小的值。

3

在Oracle中,RAW數據類型適用於存儲二進制值。

使用字符數據類型存儲二進制數據的問題是值受制於字符集轉換

如果客戶端字符集與數據庫字符集不匹配,則值將受到翻譯。 (即,一個編碼中的二進制值表示特定字符​​,但該字符可以用另一個字符集中的不同二進制值表示。

對於字符數據類型,Oracle保留「字符」值,而不是編碼二進制值。

如果要使用字符(例如CHAR或VARCHAR2)數據類型來存儲二進制值,那麼您確實需要將二進制值編碼爲純文本,並存儲和檢索編碼值。兩種流行的二進制到文本編碼是十六進制和base64(uuencode)。

Oracle提供內置函數RAWTOHEX和HEXTORAW,用於將二進制(RAW數據類型)編碼和解碼爲十六進制字符串(VARCHAR2數據類型)。