以前對Oracle字符值的比較和儲存沒有弄得很清楚,直到最近寫程序碰到了,才認真去實踐驗證了一下,結果還真的發現自己的一些錯誤熟悉。
對於char和varchar2類型數據庫列值的儲存,以前一直以為:
1、char列按輸入的值儲存,假如值長度不夠char列的長度,則在後面補上空格char(32)
2、varchar2列按輸入的值儲存,假如值長度不夠varchar2列的長度,後面不補空格 上面2點都是對的,不過下面這一點就不對了
3、即使輸入的值後面含空格,varchar2列在儲存時也會去掉,也就是說varchar2列後一定不含空格
SQL> create table testyyw(col1 char(2),col2 varchar2(2)); Table created SQL> insert into testyyw values ('x','x'); 1 row inserted SQL> insert into testyyw values ('x ','x '); 1 row inserted SQL> select dump(col1),dump(col2) from testyyw; DUMP(COL1) DUMP(COL2) ------------------------------------------------------------------------ Typ=96 Len=2: 120,32 Typ=1 Len=1: 120 Typ=96 Len=2: 120,32 Typ=1 Len=2: 120,32
用dump函數看出來了,2行在數據庫中的儲存方式不一樣的,varchar2列後面也有空格
在網上查了下Oracle字符的比較,查到了如下結果 關於字符值的比較, Oracle使用以下兩種比較規則:
1、空格補齊比較語法
對於類型CHAR、NCHAR、text literals、USER函數值, 在進行比較時, 先在較短的那個 字符串後補上空格以使長度相等, 然後再進行比較. 所以, 'ab'='ab '
2、非補齊比較語法
對於類型VARCHAR2、NVARCHAR2, 則不用補齊, 直接進行比較; 而對於1和2的類型作比較的情況,我的試驗結果都是原值直接比較,也就是按2類的方法來