我应该在Oracle中使用VARCHAR2或CHAR作为数据类型吗?
有人建议我使用CHAR来处理我需要的这些新表,但我很担心,因为这些新表将用于普及使用VARCHAR2数据类型的现有表。我担心在VARCHAR2字段中放置额外的空格以及比较问题。我知道有很多方法可以通过修剪或转换来比较它们,但我担心它会使我的代码变得混乱和错误。
你有什么看法?
答案 0 :(得分:10)
我担心在VARCHAR2字段中放置额外的空格以及比较问题。我知道有很多方法可以通过修剪或转换来比较它们,但我担心它会使我的代码变得混乱和错误。
实际上恰恰相反。使用CHAR会强制你的字符串固定长度,如果它们太短,用空格填充它们。因此,当在任何使用数据的应用程序中将CHAR与常规字符串进行比较时,该应用程序每次都需要添加修剪。换句话说,VARCHAR2是自然导致更清晰代码的选择。
一般情况下,你应该总是使用VARCHAR2,除非你有一个非常具体的理由说明你想要一个CHAR列。
如果您担心前面或末尾有额外空格的字符串,那么可以想到一些选项:
答案 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-len
和CHAR
的字符串中附加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}}为col1
且4
的长度仅为1)。 'c'
评估为FALSE,只有col1='c'
评估为真,
,而
TRIM(col1)='c'
在没有col2='v'
的情况下评估为TRUE,从而提高了比较效率。
此外,如果两个TRIM()
值的长度不同(与VARCHAR2
无关),则两个size
值之间的比较会快速失败。在这种情况下,不需要进行字符比较。
使用CHAR
和size
时,长度检查始终因填充而失败。因此,必须比较每个字符,直到第一个字符不匹配或到达字符串结尾为止,以先发生者为准。
由于CHAR(size)
和VARCHAR2(size)
都不会阻止分配短于size
的值,因此如果您需要确保只有预定长度的值,请定义长度约束(它应该等于size
)。