ram*_*393 21 sql oracle char varchar2
创建表:
CREATE TABLE test (
charcol    CHAR(10),
varcharcol VARCHAR2(10));
SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
结果:
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1 
请告诉我Varchar2和char有什么区别?我们在什么时候同时使用?
Wil*_*son 20
这是一个老线程,但它只是谷歌搜索'Oracle char vs varchar2'的顶部,虽然已经有几个答案正确描述了行为char,但我认为需要说你不应该使用它除外在两种特定情况下:
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需要提供它.你不应该真正使用它.
Wer*_*eit 19
显示差异的简单示例:
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
只是为了避免混淆很多错误的信息。以下是有关差异(包括性能)的一些信息
参考:https : //asktom.oracle.com/pls/asktom/f?p=100 :11:0 :::: P11_QUESTION_ID: 2668391900346844476
由于char只不过是一个VARCHAR2,它被空白填充为最大长度-也就是说,下面的X和Y列之间的差:
创建表t(x varchar2(30),y char(30)); 插入t(x,y)个值(rpad('a','',30),'a');
绝对没有,并且鉴于以下X和Y列之间的差异:
插入t(x,y)个值('a','a')
是X占用3个字节(空指示符,前导字节长度,'a'为1个字节),Y消耗32个字节(空指示符,前导字节长度,为'a'30个字节)
嗯,varchar2将在某种程度上“处于性能优势”。它根本不能帮助char(30)始终为30个字节-对我们来说,它只是一个varchar2,空白填充为最大长度。它可以帮助我们进行加工-零,zilch,zippo。
每当您看到有人说“速度提高50%”时,就是这样-没有例子,没有科学,没有事实,没有故事来支持它-只是大声地嘲笑他们并继续前进。
该页面上还有其他“虚构的东西”,例如:
“在CHAR中搜索速度更快,因为所有字符串彼此都存储在 指定位置,系统不必 搜索字符串的结尾。而在VARCHAR中,系统必须 先找到字符串的结尾,然后再查找搜索。”
否:一个char只是一个varchar2空白填充-我们不会“在彼此之间的指定位置”存储字符串。我们确实搜索字符串的结尾-我们使用前导字节长度来找出问题。
| 归档时间: | 
 | 
| 查看次数: | 71916 次 | 
| 最近记录: |