gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:55:07 25 4
gpt4 key购买 nike

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

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

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

乍一看,您可能希望它打印“等于”,但实际上它会打印“不等于”。这是因为 strFixed 没有存储为“这是一个字符串”;相反,它存储为“这是一个字符串”,因为 CHAR 变量在右侧用空格填充到变量声明中指定的大小。是的,我可以仔细计算字符串(顺便说一句,有 17 个),然后仔细调整声明,但这只是 SO 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/

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