與其他程式設計語言一樣,Oracle中同樣存在著資料類型。Oracle中的資料類型主要有兩個應用情境:一是用於指定資料表中列的類型;二是用於PL/SQL編程中聲明變數。Oracle的資料類型主要包括:字元型(character)、數值型(number)、日期型(date)和大對象型(LOB)。同時,Oracle提供了針對資料類型的內建函數。本章著重講述Oracle中的字元型及其相關的函數。
1 字元型簡介
Oracle中的字元型有三種,分別是char(n)、varchar(n)、varchar2(n)。
1.1 固定長度字串——char(n)
char(n)指定變數或列的資料類型為固定長度的字串。其中,n代表字串的長度。當實際字串的長度不足n時,Oracle利用空格在右端補齊。當然,Oracle不允許實際字串的長度大於n。
資料庫中列指定為char(n)類型時,n的最大值不能大於2000。否則,Oracle將拋出錯誤
當char(n)作為列的資料類型時,測試其最大長度。
SQL> create table test_char(f_char char(2001));
1.2 varchar(n)
Oracle中提供了varchar(n)的資料類型。該類型是Oracle迎合工業標準中的varchar而制定的。該數
據類型實際是一個可變長度字串類型。也就是說,當實際字串的長度不足時,不會使用空格進行填充。同樣,實際字串的長度也不允許超出n。
當作為列的資料類型出現時,varchar的最大長度不能大於4000,如下所示。
SQL> alter table test_char add f_varchar varchar(4001);
1.3 varchar2(n)
與varchar(n)類型,varchar2(n)同樣是可變長度的字串類型。Oracle在工業標準之外,自訂了該資料類型。同時Oracle也提醒使用者,盡量使用varchar2(n),而非varchar(n)。因為使用varchar2(n)可以獲得Oracle向後相容性的保證。
當作為列的資料類型出現時,varchar2的長度同樣不能大於4000,如下所示。
SQL> alter table test_char add f_varchar2 varchar2(4001);
2 字元型分析
對於一般用途的資料表來說,最常用的字串類型為varchar2(n)。
2.1 varchar2(n)與char(n)的區別
varchar2(n)為可變字串類型,而char(n)為固定字串類型。這二者的區別在於是否使用空格來補齊不足的部分。
在表test_char中,列f_char和f_varchar2的長度分別為2000和4000。先向其中插入新的記錄,並為兩列賦予相同的值。
SQL> insert into test_char(f_char, f_varchar2)
2 values('000', '000');
2.2 varchar2(n)與char(n)的選擇
char(n)類型的列通常佔用較大的儲存空間;而varchar2(n)類型的列佔用的空間較小。所以,varchar2(n)類型是我們在進行資料庫設計時的一般選擇。但這並不意味著char(n)類型應該被摒棄。相反,char(n)在效率方面要高於varchar2(n)。這是因為可變長度的字串類型在實際資料長度發生改變時,總需要不斷調整儲存空間。尤其是頻繁修改資料,而資料長度也不斷改變的情況下,這種效率的損耗尤其明顯。
大多數的應用程式,並不將資料庫端的效率作為首要考慮的需求。而更傾向於較小的空間代價,因此大多使用varchar2(n)來定義列。而char(n)則是典型的“以空間換時間”,讀者可以在實際開發中酌情選擇。
2.3 變數聲明中的字串類型
三種字串類型——char(n)、varchar(n)、varchar2(n),都可用於聲明變數。但是,利用三者聲明時,最大長度均為32767。
測試char(n)、varchar(n)及varchar2(n)用於變數聲明時的最大長度。
SQL> declare s char(32768);
3 字元型處理
3.1向左補全字串——lpad ()函數
lpad()函數用於向左補全字串。該函數主要用於字串的格式化。格式化的方式為,將字串格式化為指定長度,如有不足部分,則在字串的左端填充特定字元。其調用方式如下所示。
lpad(string, padded_length, [pad_string])
其中,第一個參數指定原始字串;第二個參數指定格式化之後的字串長度;第三個參數指定使用哪個字元來填充不足位元。
3.2 向右補全字串——rpad ()函數
與lpad()函數相似,rpad()函數返回字串格式化為特定位元的操作。只是該函數自右端補全不足位元。
利用rpad()函數實現右端補全字串。
SQL> select rpad('1', 4, '*') empplyee_no from dual;
3.3 返回字串的小寫形式——lower()函數
lower()函數用於返回字串的小寫形式。該函數僅有一個參數,即原始字串。
在資料庫中,當查詢條件可以忽略大小寫形式時,我們通常利用lower()函數進行字串大小寫形式的統一。
SQL> select username, password
from dba_users
where lower(username) = 'system';
3.4 返回字串的大寫形式——upper()函數
lower()函數相反,upper()函數用於返回字串的大寫形式。該函數僅有一個參數,即原始字串。
我們同樣可以upper()函數來改寫的查詢語句。
SQL> select username, password
from dba_users
where upper(username) = 'SYSTEM';
3.5 單詞首字元大寫——initcap()函數
initcap()函數用於將單詞轉換為首字元大寫、其它字元小寫形式。
利用initcap()函數格式化單詞。
SQL> select initcap('like') new_word from dual;
SQL> select initcap('LIKE') new_word from dual;
3.6 返回字串長度——length()函數
length()函數可用於返回字串長度。
利用length()函數返回字元長度。
SQL> select length('12345') len from dual;