在ORACLE中,当两个字符进行比较的时候,可以使用两种比较语义:填充空格式(blank-padded)或者非填充空格式(non-blank-padded)
1.填充空格式
1)如果string1和string2是不同长度的,那么首先在较短的字符串上填充空格使得它们的长度相同.
2)逐个字符地比较每个字符串,从字符串左边开始.假设string1中的字符时char1,string2的字符是char2.
3)如果ASCII(char1)<ASCII(char2),那么string1<string2.
如果ASCII(char1)>ASCII(char2),那么string1>string2.
如果ASCII(char1)=ASCII(char2),那么继续比较sting1和string2中的下一个字符.
4)如果到达了string1和string2的末尾,那么两个字符串是相同的.
使用填充空格式比较语义,那么下面的条件将都返回为TRUE
'abc'='abc'
'abc '='abc' --注意到等号左边的字符串结尾包含空格
'ab'<'abc'
'abcd'>'abcc'
2.非填充空格式
1)逐个字符地比较每个字符串,从字符串左边开始.假设string1中的字符是char1,string2的字符是char2.
2)如果ASCII(char1)<ASCII(char2),那么string1<string2.
如果ASCII(char1)>ASCII(char2),那么string1>string2.
如果ASCII(char1)=ASCII(char2),那么继续比较sting1和string2中的下一个字符.
3)如果到达了string1的末尾而没有到达string2的末尾,那么string1<string2.
如果到达了string2的末尾而没有到达string1的末尾,那么string1>string2.
使用填充空格式比较语义,那么下面的条件将都返回为TRUE
'abc'='abc'
'ab'<'abc'
'abcd'>'abcc'
但是,下面的这个条件将会返回FALSE
'abc '='abc' --注意到等号左边的字符串结尾包含空格
3.说了二者区别,那么哪一种方式在何时使用呢?
PL/SQL仅在当两个进行比较的数值拥有固定长度的时候才使用填充空格语义. 如果其中有一个数值是变长的,那么就会使用非填充空格式语义.CHAR字符类是定长的,而VARCHAR2数据类型是变长的.字符文字(用单引号括起来)始终被认为是定长的.
做了个CHAR和VARCHAR2的实验,如下所示
SQL> create table string 2 ( 3 name char(3) 4 ); Table created. SQL> insert into string values('C'); 1 row created. SQL> insert into string values('B'); 1 row created. SQL> insert into string values('A'); 1 row created. SQL> commit; Commit complete. SQL> select * from string; NAM --- C B A SQL> declare 2 v_name varchar(3); 3 begin 4 v_name:='B'; 5 delete from string 6 where name=v_name; 7 end; 8 / PL/SQL procedure successfully completed. SQL> select * from string; NAM --- C B A SQL> declare 2 v_name char(3); 3 begin 4 v_name:='B'; 5 delete from string 6 where name=v_name; 7 end; 8 / PL/SQL procedure successfully completed. SQL> select * from string; NAM --- C A SQL>
可以看到,使用CHAR的时候删除了数据B,而是用VARCHAR时没有.(由于name列类型为CHAR(3),定长,而'B'只占了一个字节,所以在后面两个字节中会补充空格)