當前位置:首頁 » 存儲配置 » oracle怎麼存儲對象數據類型

oracle怎麼存儲對象數據類型

發布時間: 2023-05-30 19:06:00

⑴ oracle如何存儲byte類型數據

這個我其實也不大懂 不過以前在倉庫中存了這方面的一點小東東 希望對你游泳 嘿嘿 不知道是不是你想要的 先搞上來你看看吧

Oracle中的BLOB和CLOB

一、區別和定義

LONG: 可變長的字元串數據,最長2G,LONG具有VARCHAR2列的特性,可以存儲長文本一個表中最多一個LONG列

LONG RAW: 可變長二進制數據,最長2G

CLOB: 字元大對象Clob 用來存儲單位元組的字元數據

NCLOB: 用來存儲多位元組的字元數據

BLOB: 用於存儲二進制數據

BFILE: 存儲在文件中的二進制數據,這個文件中的數據只能被只讀訪。但該文件不包含在資料庫內。

bfile欄位實際的文件存儲在文件系統中,欄位中存儲的是文件定位指針.bfile對oracle來說是只讀的,也不參與事務性控制和數據恢復.

CLOB,NCLOB,BLOB都是內部的LOB(Large Object)類型,最長4G,沒有LONG只能有一列的限制

要保存圖片、文本文件、Word文件各自最好用哪種數據類型?

--BLOB最好,LONG RAW也不錯,但Long是oracle將要廢棄的類型,因此建議用BLOB。

二、操作

1、 get

CLOB

java 代碼

//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
Reader inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是讀出並需要返回的數據,類型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();

BLOB

java 代碼

//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");
if (rs.next())
{
java.sql.Blob blob = rs.getBlob("BLOBATTR");
InputStream inStream = blob.getBinaryStream();
//data是讀出並需要返回的數據,類型是byte[]
data = new byte[input.available()];
inStream.read(data);
inStream.close();
}
inStream.close();
con.commit();
con.close();

2、 put

CLOB

java 代碼

//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是傳入的字元串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();

BLOB

java 代碼

//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob對象後強制轉換為oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是傳入的byte數組,定義:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();

=======================================================================

厚厚發表於 2006年06月27日

網路上很多關於JAVA對Oracle中BLOB、CLOB類型欄位的操作說明,有的不夠全面,有的不夠准確,甚至有的簡直就是胡說八道。最近的項目正巧用到了這方面的知識,在這里做個總結。
環境:
Database: Oracle 9i
App Server: BEA Weblogic 8.14
表結構:
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob)
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob)
JAVA可以通過JDBC,也可以通過JNDI訪問並操作資料庫,這兩種方式的具體操作存在著一些差異,由於通過App Server的資料庫連接池JNDI獲得的資料庫連接提供的java.sql.Blob和java.sql.Clob實現類與JDBC方式提供的不同,因此在入庫操作的時候需要分別對待;出庫操作沒有這種差異,因此不用單獨對待。

一、BLOB操作
1、入庫
(1)JDBC方式
//通過JDBC獲得資料庫連接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob對象後強制轉換為oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是傳入的byte數組,定義:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
(2)JNDI方式
//通過JNDI獲得資料庫連接
Context context = new InitialContext();
ds = (DataSource) context.lookup("ORA_JNDI");
Connection con = ds.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob對象後強制轉換為weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server對應的可能會不同)
weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是傳入的byte數組,定義:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
2、出庫
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");
if (rs.next())
{
java.sql.Blob blob = rs.getBlob("BLOBATTR");
InputStream inStream = blob.getBinaryStream();
//data是讀出並需要返回的數據,類型是byte[]
data = new byte[input.available()];
inStream.read(data);
inStream.close();
}
inStream.close();
con.commit();
con.close();
二、CLOB操作
1、入庫
(1)JDBC方式
//通過JDBC獲得資料庫連接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是傳入的字元串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
(2)JNDI方式
//通過JNDI獲得資料庫連接
Context context = new InitialContext();
ds = (DataSource) context.lookup("ORA_JNDI");
Connection con = ds.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一個空對象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//鎖定數據行進行更新,注意「for update」語句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob對象後強制轉換為weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server對應的可能會不同)
weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是傳入的字元串,定義:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
2、出庫
//獲得資料庫連接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要「for update」
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
Reader inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是讀出並需要返回的數據,類型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
需要注意的地方:
1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob幾種類型的區別
2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob幾種類型的區別

⑵ Oracle中的大對象數據類型存在的意義

Oracle資料庫支持的大對象數據類型。
在Oracle資料庫中為了更好的管理大容量的數據,專門開發了一些對應的大對象數據類型。具體的來說,有如下幾種:
一是BLOB數據類型。它是用來存儲可變長度的二進制數據。由於其存儲的是通用的二進制數據,為此在資料庫之間或者在客戶端與伺服器之間進行傳輸的時候,不需要進行字元集的轉換。為此其傳輸的效率比較高,而不容易出現亂碼現象。

二是CLOB數據類型。他主要是用來存儲可變長度的字元型數據,也就是其他資料庫中提到的文本型數據類型。雖然說VARCHAR2數據類型也可以用來存儲可變長度的字元型數據,但是其容量是非常有限的。而現在這個CLOB數據類型,其可以存儲的最大數據量是4GB。而且在定義這個數據類型的時候,不需要指定最大長度。在定義Varchar2數據類型時需要指定。

三是NCLOB數據類型。這個數據類型跟CLOB數據類型相似,也是用來存儲字元類型的數據,不過其存儲的是Unicode字元集的字元數據。同樣,在這個數據類型中,也可以存儲多達4GB容量的數量,而且在定義數據類型時不需要指定長度,資料庫會自動根據存儲的內容來進行調節。

四是BFILE數據類型。看看名字就知道跟其他的LOB數據類型不同。其是在資料庫外面存儲的可變二進制數據,其最多也可以存儲4GB的數據。這里需要注意的是,在不同的操作系統上其存儲的數據容量可能是不同的。這個數據類型的特殊在於其在資料庫之外存儲實際數據。也就是說,跟其他大對象數據類型不同,其數據並不是存儲在數據文件中,而是獨立於數據文件而存在的。

⑶ Oracle數據類型及存儲方式

概述

通過實例 全面而深入的分析oralce的基本數據類型及它們的存儲方式 以ORACLE G為基礎 介紹oralce g引入的新的數據類型 讓你對oracle數據類型有一個全新的認識 揭示一些不為人知的秘密和被忽略的盲點 從實用和優化的角度出發 討並談派論每種數據類型的特點 從這里開始oracle之旅!

第一部份 字元類型

§ char

絕賀定長字元串 會用空格來填充來達到其最大長度 最長 個位元組

. 新建一個測試表test_char 只有一個char類型的列 長度為

SQL> create table test_char(colA char( ));

Table created

. 向這個表中插入一些數據

SQL> insert into test_char values( a );

row inserted

SQL> insert into test_char values( aa );

row inserted

SQL> insert into test_char values( aaa );

row inserted

SQL> insert into test_char values( aaaa );

row inserted

SQL> insert into test_char values( aaaaaaaaaa );

row inserted

注意 最多隻能插入 個位元組 否是就報錯

SQL> insert into test_char values( aaaaaaaaaaa );

insert into test_char values( aaaaaaaaaaa )

ORA : value too large for column PUB_TEST TEST_CHAR COLA (actual: maximum: )

. 使用mp函數可以查看每一行的內部存數結構

SQL> select colA mp(colA) from test_char;

COLA DUMP(COLA)

a Typ= Len= :

aa Typ= Len= :

aaa Typ= Len= :

aaaa Typ= Len= :

aaaaaaaaaa Typ= Len= :

注意 Typ= 表示數據類型的ID Oracle為每一種數據類型都進行了編號 說明char類型的編號是

Len = 表示所在的內部存儲的長度(用位元組表示) 雖然第一例只存了一個字元 a 但是它還是佔用了 個位元組的空間

表示內部存儲方式 可見oracle的內部存儲是侍舉以資料庫字元集進行存儲的

正好是字元a的ASCII碼

可以使用chr函數把ASCII碼轉成字元

SQL> select chr( ) from al;

CHR( )

a

要想知道一個字元的ASCII碼 可以使用函數ascii

SQL> select ascii( a ) from al;

ASCII( A )

正好是空格的ascii碼值

Char類型是定長類型 它總會以空格來填充以達到一個固定寬度

使用char類型會浪費存儲空間

Oracle的數據類型的長度單位是位元組

SQL> select mp( 漢 ) from al;

DUMP( 漢 )

Typ= Len= :

可見一個漢字在oracle中是佔用了兩個位元組的

英文字母或符號只佔用一個位元組

Char( )最多可存放 個漢字

§ varchar

是一種變長的字元類型 最多可佔用 位元組的存儲空間

創建一個表 只有一列 類型為varchar 長度為

SQL> create table test_varchar( col varchar ( ));

Table created

插入一些數據

SQL> insert into test_varchar values( a );

row inserted

SQL> insert into test_varchar values( aa );

row inserted

SQL> insert into test_varchar values( aaa );

row inserted

SQL> insert into test_varchar values( aaaaaaaaaa );

row inserted

SQL> insert into test_varchar values( aaaaaaaaaaa );

用mp函數查看每一行的內部存儲結構

SQL> select col mp(col) from test_varchar;

COL DUMP(COL)

a Typ= Len= :

aa Typ= Len= :

aaa Typ= Len= :

aaaaaaaaaa Typ= Len= :

Typ= 說明varchar 類型在oracle中的類型編號為

Len代表了每一行數據所佔用的位元組數

後面是具體的存儲值

由此可見 varchar 是存多少就佔用多少空間 比較節省空間的 不會像char那樣用空格填充

§ byte 和char

在 g中 字元類型的寬度定義時 可以指定單位

Byte就是位元組

Char就是字元

Varchar ( byte) 長度為 個位元組

Varchar ( char) 長度為 個字元所佔的長度

Char( byte)長度為 個位元組

Char( char) 長度為 個字元所佔的長度

一個字元佔用多少個位元組 是由當前系統採用的字元集來決定的

如一個漢字佔用兩個位元組

查看當前系統採用的字元集

SQL> select * from nls_database_parameters where parameter = NLS_CHARACTERSET ;

PARAMETER VALUE

NLS_CHARACTERSET ZHS GBK

如果在定義類型時 不指定單位 默認是按byte 即以位元組為單位的

採用char為單位的好處是 使用多位元組的字元集

比如 在ZHS GBK字元集中 一個漢字佔用兩個位元組

把數據表的某一列長度定義為可存放 個漢字 通過下面的定義就可以了

Create table test_varchar(col_char varchar ( char));

這樣相對簡單一些 在資料庫表設計時需要注意

繼續實驗 新建一個表 包含兩列 一列採用byte為單位 一列採用char為單位

SQL> create table test_varchar (col_char varchar ( char) col_byte varchar ( byte));

Table created

Col_char列 定義為可存放 個字元

Col_byte 列 定義為可存放 個位元組的字元

當前的系統採用字元集為ZHS GBK 所以一個字元占兩個位元組

試著在表中插入一些數據

SQL> insert into test_varchar values( a a );

row inserted

SQL> insert into test_varchar values( 袁 a );

row inserted

SQL> insert into test_varchar values( 袁袁袁袁袁袁袁袁袁袁 aaaaaaaaaa );

row inserted

SQL> insert into test_varchar values( 袁袁袁袁袁袁袁袁袁袁 袁袁袁袁袁袁袁袁袁袁 );

insert into test_varchar values( 袁袁袁袁袁袁袁袁袁袁 袁袁袁袁袁袁袁袁袁袁 )

ORA : value too large for column PUB_TEST TEST_VARCHAR COL_BYTE (actual: maximum: )

第一次 在兩列中都插入字元a

第二次 在col_char列插入字元 袁 在col_byte插入字元a

第三次 在col_char列中插入 個中文字元 袁 在col_byte插入 個字元a

第四次 在兩列中都插入中文字元 袁 時 報錯了 第二列長度不夠

再看看每一行的存儲結構

SQL> select col_char mp(col_char) from test_varchar ;

COL_CHAR DUMP(COL_CHAR)

a Typ= Len= :

袁 Typ= Len= :

袁袁袁袁袁袁袁袁袁袁 Typ= Len= :

當我們在col_char列插入 個漢字時 它的長度為

盡管我們在定義的時候是採用varchar ( char)

由此可見 oracle是根據當前資料庫採用的字元集 每個字元的所佔位元組數 X 欄位長度來決定了該欄位所佔的位元組數

在本例中 varchar ( char)相當於varchar ( )

不信 我們可以試試看

SQL> desc test_varchar ;

Name Type Nullable Default Comments

COL_CHAR VARCHAR ( ) Y

COL_BYTE VARCHAR ( ) Y

當採用多位元組的字元集時 定義欄位長度還是採用char為單位指定為佳 因為可以避免欄位長度的問題

當不知道當前資料庫採用的字元集 一個字元佔用多少位元組時 可以使用lengthb函數

SQL> select lengthb( 袁 ) from al;

LENGTHB( 袁 )

§ char還是varchar

新建一個表 一列為char類型 一列為varchar 類型

SQL> create table test_char_varchar(char_col char( ) varchar_col varchar ( ));

Table created

向該表中的兩列都插入相關的數據

SQL> insert into test_char_varchar values( Hello World Hello World );

row inserted

SQL> select * from test_char_varchar;

CHAR_COL VARCHAR_COL

Hello World Hello World

以char_col列為條件查詢

SQL> select * from test_char_varchar where char_col = Hello World ;

CHAR_COL VARCHAR_COL

Hello World Hello World

以varchar_col列為條件查詢

SQL> select * from test_char_varchar where varchar_col = Hello World ;

CHAR_COL VARCHAR_COL

Hello World Hello World

似乎char 和varchar類型沒有什麼兩樣 再看看下面的語句

SQL> select * from test_char_varchar where varchar_col =char_col;

CHAR_COL VARCHAR_COL

這已經看出他們並不一樣 這涉及到字元串比較的問題

因為已經發生了隱式轉換 在與char列char_col進行比較時 char_col列的內容已經轉換成了char( ) 在Hello World後面以空格進行填充了 而varchar_col列並沒有發生這種轉換

如果要讓char_col列與varchar_col列相等 有兩種方法

第一種是 使用trim把char_col列的空格去掉

第二種是 使遙rpad把varchar_col列用空格進行填充長度為 的字元

SQL> select * from test_char_varchar where trim(char_col) = varchar_col;

CHAR_COL VARCHAR_COL

Hello World Hello World

SQL> select * from test_char_varchar where char_col = rpad(varchar_col );

CHAR_COL VARCHAR_COL

Hello World Hello World

如果使用trim函數 如果char_col列上有索引 那麼索引將不可用了

lishixin/Article/program/Oracle/201311/17771

熱點內容
埠掃描源碼 發布:2025-02-07 02:31:01 瀏覽:470
androidurl獲取圖片 發布:2025-02-07 02:22:11 瀏覽:482
調用上傳 發布:2025-02-07 02:19:53 瀏覽:84
aix編譯安裝 發布:2025-02-07 02:19:52 瀏覽:906
android界面設計尺寸 發布:2025-02-07 02:16:25 瀏覽:898
zenly安卓為什麼會一直閃 發布:2025-02-07 02:12:02 瀏覽:357
為什麼安卓手機界面總出廣告 發布:2025-02-07 02:10:33 瀏覽:244
plc數據塊怎麼編譯 發布:2025-02-07 02:09:44 瀏覽:98
ct加密 發布:2025-02-07 02:09:03 瀏覽:919
編程差別 發布:2025-02-07 02:06:37 瀏覽:348