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列;sname
VARCHAR2(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 最大限度地