+ -
当前位置:首页 → 问答吧 → char类型的字段为什么会忽略末尾的空格?

char类型的字段为什么会忽略末尾的空格?

时间:2011-09-09

来源:互联网

SQL> desc test_char
Name Type    Nullable Default Comments
---- ------- -------- ------- --------
ID   NUMBER  Y                        
NAME CHAR(6) Y   
SQL> select * from test_char where name='abcd';
        ID NAME
---------- ------
         1 abcd
SQL> select * from test_char where name='abcd  ';
        ID NAME
---------- ------
         1 abcd
SQL> select * from test_char where name='abcd      ';
        ID NAME
---------- ------
         1 abcd
SQL> select * from test_char where name='abcd          ';
        ID NAME
---------- ------
         1 abcd

作者: BTxigua   发布时间: 2011-09-09

这东西看文档就行了,char,nchar,字符串字面量和varchar2等不同,采用的是填补空格的比较规则,也就是短的会在尾部补空格等长度一致后比较,varchar2神马的是非填补空格的比较

这东西一般人不注意,看文档看的就是这些容易迷惑的

作者: dingjun123   发布时间: 2011-09-09



QUOTE:原帖由 dingjun123 于 2011-9-9 10:39 发表
这东西看文档就行了,char,nchar,字符串字面量和varchar2等不同,采用的是填补空格的比较规则,也就是短的会在尾部补空格等长度一致后比较,varchar2神马的是非填补空格的比较

这东西一般人不注意,看文档看的就是这些容易迷惑的

这个我知道。
为什么在where条件里面无论加多少个空格都可以匹配呢?

作者: BTxigua   发布时间: 2011-09-09



QUOTE:原帖由 BTxigua 于 2011-9-9 10:48 发表


这个我知道。
为什么在where条件里面无论加多少个空格都可以匹配呢?

你的where不是比较吗?左边是char,右边字面量,就是填补空格的比较啦,只要把空格全都去掉后字面量一样就相等,你把字面量改成varchar2就不一样了

你既然知道这规则怎么还不明白呢?

dingjun123@ORADB> select * from dual where cast('abcd' as char(10))=cast('abcd' as varchar2(10));

未选定行

已用时间:  00: 00: 00.00
dingjun123@ORADB> select * from dual where cast('abcd' as char(10))='abcd';

D
-
X

已选择 1 行。

已用时间:  00: 00: 00.07
dingjun123@ORADB> select * from dual where cast('abcd' as varchar2(10))='abcd   ';

未选定行

已用时间:  00: 00: 00.00



已用时间:  00: 00: 00.03
dingjun123@ORADB> select * from dual where cast('abcd' as varchar2(10))='abcd';

D
-
X

已选择 1 行。

已用时间:  00: 00: 00.01

作者: dingjun123   发布时间: 2011-09-09

无论尾部多少空格只要去掉尾部的空格的字面量一样就是一样的,padding规则
先比较字符串长度,短的那端尾部补空格后比较

作者: dingjun123   发布时间: 2011-09-09