Sql Varchar2和char之间的主要区别是什么
创建表格:Sql Varchar2和char之间的主要区别是什么,sql,oracle,char,varchar2,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 结果: CREATE TAB
CREATE TABLE test (
charcol CHAR(10),
varcharcol VARCHAR2(10));
SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
10 1
结果:
CREATE TABLE test (
charcol CHAR(10),
varcharcol VARCHAR2(10));
SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
10 1
请让我知道Varchar2和char的区别是什么?
我们在什么时候同时使用这两种格式?CHAR类型的大小是固定的,因此如果您说它是10个字节,那么它总是在数据库中存储10个字节,而不管您存储的是文本还是空的10个字节 VARCHAR2大小取决于实际存储在数据库中的字节数。您指定的数字只是可以存储的最大字节数(尽管最小值为1字节) 在处理固定长度的字符串时,应该使用CHAR(您预先知道要存储的字符串的确切长度)-然后数据库可以更好更快地使用它进行操作,因为它知道确切的长度 当您不知道存储字符串的确切长度时,应该使用VARCHAR2 您可能会同时使用这两种方法:
name VARCHAR2(255),
zip_code CHAR(5) --if your users have only 5 place zip codes
CHAR
CHAR应用于存储固定长度的字符串。字符串值在存储到磁盘之前将填充空格/空白。如果使用此类型存储可变长度字符串,将浪费大量磁盘空间
VARCHAR2
VARCHAR2用于存储可变长度的字符串。字符串值的长度将与值本身一起存储在磁盘上
和
At what times we use both?
这一切都取决于您的要求。CHAR用于存储固定长度的字符串。如果使用此类型存储可变长度字符串,将浪费大量磁盘空间 VARCHAR2用于存储可变长度字符串 我们在什么时候同时使用这两种方法 这可能会有所不同,并取决于您的要求 编辑:-
让我们通过一个例子来理解这一点,如果您有一个大小为10的学生姓名列;sname
CHAR(10)
如果插入列值'RAMA'
,则将在值的右侧插入6个空格。如果这是一个VARCHAR列;snameVARCHAR2(10)。
然后Varchar将从10个可能的空格中取出4个,并将接下来的6个空格释放出来供其他使用 显示差异的简单示例:
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.
字符用于字符长度始终固定的表达式,例如美国各州的邮政编码,例如CA、NY、FL、TX,尽管已经有几个答案正确描述了字符的行为,我认为需要指出的是,除非在三种特定情况下,否则不应使用它:
char
指定一个非空值,以避免编写rpad()
表达式。例如,如果firstname
和lastname
都被定义为char(20)
,那么firstname | | lastname
是rpad(firstname,20)| rpad(lastname,20)
创建Chuck Norris
的较短书写方式'
和null
。通常情况下,它们在Oracle中是相同的,但是将'
赋值给char
值将触发其空白填充行为,而null
则不会,因此如果区分差异很重要,我真的想不出原因,那么您有办法做到这一点Y/N
标志或ISO货币代码,如“USD”
),就没有理由使用char。它没有更高的效率,也没有节省空间(对于varchar2
,没有虚构的长度指示器,对于char
,只有一个空白的填充开销),而且它不会阻止任何人输入较短的值。(如果在char(3)
currency列中输入'ZZ'
,它将被存储为'ZZ'
)它甚至不能与以前依赖它的Oracle的某个古老版本向后兼容,因为从来没有过向后兼容的版本
这种传染可能会蔓延,因为(遵循最佳实践)您可能会使用类似于sales.currency%type
的方法锚定变量声明。现在,您的l_sale_currency
变量是一个隐形的char
,它将以不可见的空白填充较短的值(或'
),从而打开了一扇隐藏bug的大门,在这些bug中l_sale_currency
不等于l_退款_currency
,即使您将'ZZ'
分配给这两个变量
一些人认为char(n)
(其中n是一些字符长度)表示值的长度应为n个字符,这是一种自我记录的形式。但是,如果您对3字符格式(例如,国家代码而非国家代码)很认真,您是否会定义一个约束来强制执行规则,而不是让开发人员浏览char(3)
数据类型并得出他们自己的结论
CHAR
是在Oracle 6中引入的,我确信是出于ANSI兼容性的原因。可能有潜在客户决定购买哪种数据库产品,并且ANSI兼容性在他们的清单上(或以前是),ANSI标准中定义了带空白填充的CHAR
,因此Oracle需要提供它。您不应该实际使用它。只是为了避免混淆许多错误信息。以下是有关差异的一些信息,包括性能
参考:
因为char只不过是一个空白填充的VARCHAR2
最大限度地