Oracle数据类型:我应该使用VARCHAR2还是CHAR

时间:2011-10-12 22:06:59

标签: oracle plsql

我应该在Oracle中使用VARCHAR2或CHAR作为数据类型吗?

有人建议我使用CHAR来处理我需要的这些新表,但我很担心,因为这些新表将用于普及使用VARCHAR2数据类型的现有表。我担心在VARCHAR2字段中放置额外的空格以及比较问题。我知道有很多方法可以通过修剪或转换来比较它们,但我担心它会使我的代码变得混乱和错误。

你有什么看法?

5 个答案:

答案 0 :(得分:10)

  

我担心在VARCHAR2字段中放置额外的空格以及比较问题。我知道有很多方法可以通过修剪或转换来比较它们,但我担心它会使我的代码变得混乱和错误。

实际上恰恰相反。使用CHAR会强制你的字符串固定长度,如果它们太短,用空格填充它们。因此,当在任何使用数据的应用程序中将CHAR与常规字符串进行比较时,该应用程序每次都需要添加修剪。换句话说,VARCHAR2是自然导致更清晰代码的选择。

一般情况下,你应该总是使用VARCHAR2,除非你有一个非常具体的理由说明你想要一个CHAR列。

如果您担心前面或末尾有额外空格的字符串,那么可以想到一些选项:

  • 确保插入过程中正在进行的任何过程。
  • 在列上添加一个检查约束,以确保string = trim(string)。
  • 添加一个插入前的行级触发器,在插入字符串时对其进行修剪。
  • 确保在查询表时对字符串进行修剪

答案 1 :(得分:4)

读:

来自AskTom的文章:

  

CHAR / NCHAR实际上只不过是一个事实   伪装的VARCHAR2 / NVARCHAR2让我觉得有   实际上只有两种字符串类型可供考虑,即   VARCHAR2和NVARCHAR2。我从来没有找到过CHAR类型的用途   任何申请。由于CHAR类型总是空白填充结果   串出一个固定的宽度,我们迅速发现它消耗   表段和任何索引段中的最大存储量。那   会很糟糕,但还有另一个重要的理由可以避免   CHAR / NCHAR类型:它们会在需要的应用程序中产生混淆   检索此信息(许多人在存储后无法“找到”他们的数据   它)。其原因与字符串规则有关   比较和严格执行。

答案 2 :(得分:3)

CHAR有趣的比较语义。如果您只使用VARCHAR2,那么您不需要学习CHAR语义。老实说,我认为如果我有一个已知固定lenth的字段,我仍然会将其定义为VARCHAR2并使用检查约束来强制执行它的固定长度,而不是学习CHAR比较语义。

有些人认为CHAR对固定长度数据更有效,因为长度不需要存储,但那是untrue on Oracle

答案 3 :(得分:0)

我建议您坚持使用VARCHAR2。

当数据是已知的固定长度时,您应该使用CHAR。

答案 4 :(得分:0)

选择VARCHAR2(size)而不是CHAR(size),因为这样可以节省更多空间和时间:

令人惊讶的是,CHAR(size)允许分配长度len短于size的字符串。在这种情况下,ORACLE会在数据类型size-lenCHAR的字符串中附加VARCHAR个空格,并存储size个字符。 VARCHAR2数据类型没有填充,只存储len个字符。

CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4));
INSERT INTO Demo (col1, col2) VALUES ('c', 'v');

结果,

col1='c '(填充3个尾随空格,因为size的{​​{1}}为col14的长度仅为1)。 'c'评估为FALSE,只有col1='c'评估为真,

,而

TRIM(col1)='c'在没有col2='v'的情况下评估为TRUE,从而提高了比较效率。

此外,如果两个TRIM()值的长度不同(与VARCHAR2无关),则两个size值之间的比较会快速失败。在这种情况下,不需要进行字符比较。 使用CHARsize时,长度检查始终因填充而失败。因此,必须比较每个字符,直到第一个字符不匹配或到达字符串结尾为止,以先发生者为准。

由于CHAR(size)VARCHAR2(size)都不会阻止分配短于size的值,因此如果您需要确保只有预定长度的值,请定义长度约束(它应该等于size)。