gpt4 book ai didi

oracle - 为什么使用 varchar2 而不是 char 作为包常量?

转载 作者:行者123 更新时间:2023-12-02 21:53:44 24 4
gpt4 key购买 nike

刚刚遇到一个包,它定义了大量的包全局常量字符串,如下所示:

DESTINATION_1 CONSTANT VARCHAR2(13) := '515 Pine Lane';
DESTINATION_2 CONSTANT VARCHAR2(18) := '670 Woodhaven Lane';

char 相比,使用 varchar2 作为这些数据类型有什么好处吗?

使用 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;

乍一看,您可能会期望它打印“Equal”,但实际上它会打印“Not equal”。之所以如此,是因为 strFixed 没有存储为“这是一个字符串”;相反,它被存储为“这是一个字符串”,因为 CHAR 变量在右侧用空格填充到变量声明中指定的大小。是的,我可以仔细计算了字符串(顺便说一句,有 17 个),然后仔细调整声明,但这只是 1970 年代的事情(我记得有点模糊,不想重温:-)。并且,天哪,我错误地计算了字符串中的字符数,因此固定字符串将在右侧填充以将其填充到声明的长度,而我的比较仍然将不起作用。

我将使用 CHAR 而不是 VARCHAR2 的一种情况是常量变量仅应为单个字符长。 IMO 将某些内容声明为 VARCHAR2(1) 是错误的。 :-)

顺便说一下,如果您查看 SYS.STANDARD 包,您会发现 CHAR 被声明为

subtype CHAR is VARCHAR2;

因此,CHAR VARCHAR2。不确定空间填充是如何完成的,但空间填充很可能是在运行时完成的,因此会增加额外的时间。

其中之一是否具有性能优势?最多不会太多。我认为,如果 CHAR 变量有一些空格填充,则比较所需时间会比等效的未填充 VARCHAR2 值长一点,但实际上,我认为这并不重要。另外,由于空间填充是在运行时完成的,这会增加时间。我怀疑这是一次清洗,并且肯定会被 SQL 效果淹没。

分享并享受。

关于oracle - 为什么使用 varchar2 而不是 char 作为包常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com