3 回答
TA贡献1869条经验 获得超4个赞
显示差异的简单示例:
SELECT
'"'||CAST('abc' AS VARCHAR2(10))||'"',
'"'||CAST('abc' AS CHAR(10))||'"'
FROM dual;
'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc" "abc "
1 row selected.
CHAR对于总是固定字符长度的表达式是有用的,例如美国州的邮政编码,例如CA,NY,FL,TX
TA贡献1812条经验 获得超5个赞
这是一个老线程,但它只是谷歌搜索'Oracle char vs varchar2'的顶部,虽然已经有几个答案正确描述了行为char
,但我认为需要说你不应该使用它除外在两种特定情况下:
您正在构建固定长度的文件或报告,并为a分配非null值,从而
char
避免了对rpad()
表达式进行编码的需要。例如,如果firstname
和lastname
都被定义为char(20)
,那么firstname || lastname
是一种较短的写作方式rpad(firstname,20) || rpad(lastname,20)
。您需要区分显式空字符串
''
和null
。通常它们在Oracle中是相同的,但是分配''
给一个char
值会触发它的空白填充行为,而null
不是,所以如果说出差异是很重要的,我真的不能想到它会出现原因的原因,那么你有办法做到这一点。
实际上没有理由char
因为某些长度是固定的(例如Y/N
标志或ISO货币代码等'USD'
)而使用。它不是更高效,它不节省空间(没有神秘的长度指示器varchar2
,只有一个空白的填充开销char
),并且它不会阻止任何人输入更短的值。(如果你输入'ZZ'
你的char(3)
货币栏,它就会被存储为'ZZ '
。)它甚至不能与曾经依赖它的某些古老版本的Oracle向后兼容,因为它从来没有。
传染病可以传播,因为(按照最佳实践),您可以使用类似的东西锚定变量声明sales.currency%type
。现在你的l_sale_currency
变量是一个秘密char
,它会为更短的值(或''
)进行无形填空,即使你已经分配给它们两个,也会打开隐藏在l_sale_currency
不相等的错误的大门。l_refund_currency
'ZZ'
CHAR
我确信,在Oracle 6中引入了ANSI兼容性原因。可能有潜在的客户决定购买哪个数据库产品,并且ANSI兼容性在他们的核对表上(或者当时是在那时),并且CHAR
在ANSI标准中定义了空白填充,因此Oracle需要提供它。你不应该真正使用它。
添加回答
举报