刚刚遇到一个包,它定义了大量的包全局常量字符串,如下所示:
DESTINATION_1 CONSTANT VARCHAR2(13) := '515 Pine Lane';
DESTINATION_2 CONSTANT VARCHAR2(18) := '670 Woodhaven Lane';
Run Code Online (Sandbox Code Playgroud)
使用varchar2这些数据类型是否有任何好处char?
使用Oracle 11g第2版.
通常我对所有字符串变量或常量声明使用VARCHAR2而不是CHAR,原因很简单,因为VARCHAR2语义更符合我的期望.这里的问题是,如果开发人员对其常量长度的计数不准确,如果声明为CHAR,它将在空白处填充空白,而如果声明为VARCHAR2,它将简单地存储而不填充.考虑:
DECLARE
strFixed CHAR(20) := 'This is a string';
strVariable VARCHAR2(20) := 'This is a string';
BEGIN
IF strFixed = strVariable THEN
DBMS_OUTPUT.PUT_LINE('Equal');
ELSE
DBMS_OUTPUT.PUT_LINE('Not equal');
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
初看起来你可能希望这打印"Equal",但它实际上会打印"Not equal".这是因为strFixed不存储为'This is a string'; 相反,它存储为"这是一个字符串",因为CHAR变量在右边填充,空白为变量声明中指定的大小.是的,我可以仔细计算字符串中的字符数(有17个,顺便说一下),然后仔细调整的声明,但这只是SO 1970年的(十年我记得有些模模糊糊并不在乎重温:-).而且,哦,亲爱的,我算错了字符串中的字符数,所以固定的字符串将被填充在右边以填充到声明的长度,我的比较仍然没有用.
我将使用CHAR而不是VARCHAR2的一种情况是,如果常量变量只应该是单个字符长.IMO宣称VARCHAR2(1)是错误的.:-)
刚刚通过我会注意到,如果你查看SYS.STANDARD包,你会发现CHAR被声明为
subtype CHAR is VARCHAR2;
Run Code Online (Sandbox Code Playgroud)
因此,CHAR 是 VARCHAR2.不确定空间填充是如何完成的,但很可能是空间填充在运行时完成,因此增加了额外的时间.
一个或另一个有性能优势吗?最多不会太多.我想如果一个CHAR变量有一些空格填充,它将比一个等效的无填充VARCHAR2值更长一些头发,但实际上我认为这不重要.此外,由于空间填充在运行时完成,这将增加时间.我怀疑它是一种洗涤,肯定会被SQL效应所淹没.
分享和享受.