關於oracle中字串的說明
字串
oracle中有四種基本的字串型別,分別是char、varchar2、nchar和nvarchar2。在oracle中,所有串都以同樣的格式儲存。在資料塊有乙個1~3位元組的長度字段,其後才是資料,如果資料位null,長度欄位則表示為乙個單位元組值0xff.
如果串的長度小於或等於250(0x01~0xfa),oracle會使用1個位元組來表示長度。對於所有長度超過250的串,都會在乙個標誌位元組0xfe後跟有兩個位元組來表示長度。因此,如果有個包含「hello word」的varchar2(80),則在塊中可能是:[11][h][e][l][l][o][w][o][r][l][d]
如果在乙個char(80)中儲存同樣的資料,則可能是:[80][h][e][l][l][o][w][o][r][l][d][68].....[0]
例子:ops$tkyte@ora10g>create table t
2 (car_column char(20))
3 varchar2_column varchar2(20)
4 )5 /
table created.
ops$tkyte@ora10g>insert into t values('hello world','hello world');
1 row created.
ops$tkyte@ora10g> select * from t;
char_column varhcar2_column
hello world hello world
ops$tkyte@ora10g> select * from t where char_column='hello world';
char_column varhcar2_column
hello world hello world
ops$tkyte@ora10g>select * from t where varchar2_column='hello world';
char_column varhcar2_column
hello world hello world
以上的操作看不出什麼效果對吧,繼續看下面的內容:
ops$tkyte@ora10g>select * from t where cahr_column=varchar2_column;
no rows selected
原因是在char列比較時,char(11)直接量('hello world')已經提公升為乙個char(20),並在其中填充了空格。這種轉換肯定已經發生了,因為hello world......與沒有尾部空格的hello world 並不相同。
要麼必須用空格填充varchar2_column列,使其長度達到20位元組,要麼必須從char_column列截去尾部的空格:
ops$tkyte@ora10g>select * from t where trim(char_column)=varchar2_column;
char_column varhcar2_column
hello world hello world
ops$tkyte@ora10g>select * from t where char_column=rpad(varchar2_column,20);
char_column varhcar2_column
hello world hello world
以上內容是摘抄,原文見(oracle9i&10g程式設計藝術-深入資料庫體系結構)p494
oracle中擷取字串
substring 返回字元 binary text 或 image 表示式的一部分。有關可與該函式一起使用的有效 microsoft sql server 資料型別的更多資訊,請參見資料型別。語法 substring expression start length 引數 expression 是字...
Oracle中隨機生成字串
生成隨機字串的方法 sys guid 但是該方法生成的在資料庫中顯示出來如果是亂碼則需要寫成 rawtohex sys guid 具體應用場景 用sql語句往表裡insert一條記錄時,主鍵不能為空,否則會報錯,又由於主鍵的唯一性,此時我們就要用到隨機生成字串的方法。如 insert into a ...
Oracle字串函式
這些函式全都接收的是字元族型別的引數 chr除外 並且返回字元值.除了特別說明的之外,這些函式大部分返回varchar2型別的數值.字元函式的返回型別所受的限制和基本資料庫型別所受的限制是相同的。字元型變數儲存的最大值 varchar2數值被限制為2000字元 oracle 8中為4000字元 ch...