Creating Table:
CREATE TABLE test (
charcol CHAR(10),
varcharcol VARCHAR2(10));
SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
Result:
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
10 1
请告诉我Varchar2和char有什么区别?我们在什么时候同时使用?
6 回答
显示差异的简单示例:
CHAR对于总是固定字符长度的表达式是有用的,例如,美国各州的邮政编码,例如CA,NY,FL,TX
这是一个老线程,但它只是'Oracle char vs varchar2'的谷歌搜索的顶部,虽然已经有几个答案正确描述
char
的行为,但我认为需要说除了在两种特定情况下你不应该使用它:您正在构建固定长度的文件或报告,并为
char
分配非空值,从而避免了编写rpad()
表达式的需要 . 例如,如果firstname
和lastname
都定义为char(20)
,则firstname || lastname
是写入rpad(firstname,20) || rpad(lastname,20)
的较短方式 .您需要区分显式空字符串
''
和null
. 通常它们在Oracle中是相同的,但将''
分配给char
值将触发其空白填充行为,而null
则不会,所以如果它真的想到它之所以存在的原因,那么你有办法做那 .确实有 no reason to use char 因为某些长度是固定的(例如
Y/N
标志或ISO货币代码,例如'USD'
) . 它节省了空间(varchar2
没有神秘的长度指示器,char
只有一个空白的填充开销),并且它不会阻止任何人输入更短的值 . (如果在char(3)
货币列中输入'ZZ'
,它将被存储为'ZZ '
. )它甚至不能与曾经依赖它的某个古老版本的Oracle向后兼容,因为它从来没有 .传染病可以传播,因为(按照最佳实践),您可以使用
sales.currency%type
之类的东西锚定变量声明 . 现在你的l_sale_currency
变量是一个隐形char
,它将为更短的值(或''
)隐形填空,打开了隐藏错误的大门l_sale_currency
不等于l_refund_currency
,即使你为它们分配了'ZZ'
.CHAR
是在Oracle 6中引入的,我敢肯定,ANSI兼容性的原因 . 可能有潜在的客户决定购买哪个数据库产品并且ANSI兼容性在他们的核对清单上(或者曾经在当时),并且CHAR
带有空白填充在ANSI标准中定义,因此Oracle需要提供它 . 你不应该真正使用它 .CHAR 类型具有固定大小,因此如果你说它是10个字节,那么它总是在数据库中存储10个字节,无论你是存储任何文本还是只是空10个字节都无关紧要
VARCHAR2 size取决于您实际要在数据库中存储的字节数 . 您指定的数字只是可以存储的最大字节数(尽管最少1个字节)
在处理固定长度的字符串时你应该使用CHAR(你事先知道你将要存储的字符串的确切长度) - 然后数据库可以更好更快地操作它,因为它知道确切的长度
当您不知道存储字符串的确切长度时,应该使用VARCHAR2 .
您将使用两者的情况可能是:
只是为了避免混淆错误的信息 . 以下是有关差异的一些信息,包括性能
参考:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476
CHAR
CHAR应该用于存储修复长度字符串 . 在存储在磁盘上之前,字符串值将为空格/空白填充 . 如果此类型用于存储varibale长度字符串,则会浪费大量磁盘空间 .
VARCHAR2
VARCHAR2用于存储可变长度的字符串 . 字符串值的长度将以值本身存储在磁盘上 .
And
这完全取决于您的要求 .
CHAR 用于存储修复长度字符串 . 如果此类型用于存储varibale长度字符串,则会浪费大量磁盘空间 .
VARCHAR2 用于存储可变长度的字符串 .
这可能会有所不同,取决于您的要求 .
EDIT:-
让我们通过一个例子理解这一点,如果你有一个大小为10的学生姓名栏; sname
CHAR(10)
并且如果插入了列值'RAMA'
, 6 empty spaces 将插入值的右侧 . 如果这是VARCHAR列; snameVARCHAR2(10).
然后Varchar将从10个中取出4个空格,然后释放下6个用于其他用途 .