首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL中CHAR和VARCHAR2的区别

Oracle SQL中CHAR和VARCHAR2的区别
EN

Stack Overflow用户
提问于 2017-01-12 00:52:54
回答 4查看 1.6K关注 0票数 1

我有一个名为tab1的表,其列为col1,数据类型为varchar2(10),另一个名为tab2的表,其单个列为col2,数据类型为char(20)

数据如下:

代码语言:javascript
复制
tab1    tab2
a        a
b        b
c        c

当我运行以下查询时

代码语言:javascript
复制
select tab1.*,tab2.*
from tab1 full join tab2
on tab1.col1 = tab2.col2;

我得到以下输出:

代码语言:javascript
复制
col1   col2
null   a
null   b
null   c
a      null
b      null
c      null

我知道char占用固定内存,但是oracle不应该在字符串比较时加入吗?

EN

回答 4

Stack Overflow用户

发布于 2017-01-12 00:59:14

varchar2(10)只占用了所需的空间。

如果文本长度较小,char(20)将在末尾填充空白。

因此,在tab1 col1中,值a存储为a,但在tab2 col2中,值a存储为a,因此不匹配。

票数 4
EN

Stack Overflow用户

发布于 2017-01-12 00:58:55

Char被空白填充到它的全宽,所以您正在比较

代码语言:javascript
复制
'a                   ' with 'a'

它们是不一样的

票数 2
EN

Stack Overflow用户

发布于 2017-01-12 01:22:25

直接从Oracle文档...

https://docs.oracle.com/database/122/SQLRF/Data-Type-Comparison-Rules.htm#SQLRF30027

空白填充和非填充比较语义

如果两个值的长度不同,则

首先在较短的值的末尾添加空格,以便它们的长度相等。然后,Oracle会逐个字符地比较这些值,直到第一个不同的字符。在第一个不同位置具有较大字符的值被认为较大。如果两个值没有不同的字符,则认为它们相等。此规则意味着,如果两个值仅在尾随空格的数量上不同,则它们是相等的。仅当比较中的两个值都是CHAR、NCHAR、text文本数据类型的表达式或USER函数返回的值时,Oracle才使用填充空格的比较语义。

使用非填充语义时,Oracle会逐个字符地比较两个值,直到第一个不同的字符。该位置的字符越大,则认为该值越大。如果两个不同长度的值在较短的一个值的末尾是相同的,则认为较长的值较大。如果两个长度相等的值没有不同的字符,则认为这两个值相等。只要比较中的一个或两个值的数据类型为VARCHAR2或NVARCHAR2,Oracle就会使用无填充的比较语义。

使用不同的比较语义比较两个字符值的结果可能不同。下表显示了使用每种比较语义比较五对字符值的结果。通常,空白填充和非填充比较的结果是相同的。表中的最后一个比较说明了空白填充和非填充比较语义之间的差异。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41596413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档