暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库CHAR与NCHAR数据类型区别

SQL数据库运维 2022-09-23
2535

点击蓝色字关注“SQL数据库运维”,回复“SQL”获取2TB学习资源!

Oracle CHAR数据类型概述

Oracle CHAR数据类型用于存储固定长度的字符串。CHAR数据类型可以存储12000字节的字符串。
要定义一个CHAR列,需要用字节或字符来指定一个字符串长度,如下所示:

    CHAR(length BYTE)
    CHAR(length CHAR)

    如果没有明确指定BYTECHAR,那么Oracle会默认使用BYTE

    如果像下面的例子那样不指定长度,那么长度的默认值是1
      column_name CHAR
      插入或更新固定长度字符串列时,Oracle将字符存储为固定长度数据。这意味着如果存储的值的长度小于列中定义的最大长度,则Oracle将空格填充到最大长度的字符串。如果插入一个长度大于列的值,Oracle会返回一个错误。
      Oracle使用空格填充后来比较CHAR值。

      Oracle CHAR空格使用的例子

      下面来看看一些例子来理解CHAR数据类型的工作原理。

      首先,创建一个由CHAR列(x)和VARCHAR2列(y)组成的新表t 。每列的长度是10个字节。

        CREATE TABLE t (
        x CHAR(10),
        y VARCHAR2(10)
        );

        其次,用xy列的相同数据在t表中插入一个新行:

          INSERT INTO t(x, y )
          VALUES('Oracle', 'Oracle');

          第三,通过使用以下查询验证插入:

            SELECT * FROM t;

            执行上面示例代码,得到以下结果:

            以下语句从t表中检索数据:

              SELECT
              x,
              DUMP(x),
              y,
              DUMP(y)
              FROM
              t;

              执行上面查询代码,得到以下结果:

              在这个例子中,使用了DUMP()函数来返回x和y列的详细信息:

              字符串Oracle需要6个字节。但是,Oracle在字符串的右侧再填充4个空格,使x列的长度为10个字节。y列的情况并非如此,因为y列的数据类型是可变长度字符串类型:(VARCHAR2)。

              如果使用LENGTHB()函数来获取x和y列使用的字节数,则更加清楚:

                SELECT
                LENGTHB(x),
                LENGTHB(y)
                FROM
                    t;
                执行上面查询代码,得到以下结果:




                Oracle NCHAR数据类型概述
                Oracle NCHAR数据类型用于存储固定长度的Unicode字符数据。NCHAR的字符集只能是AL16UTF16或UTF8,在数据库创建时指定为国家字符集。
                当使用NCHAR列创建表时,NCHAR列的最大大小始终在字符长度语义中,例如:
                  CREATE TABLE nchar_demo (
                  description NCHAR(10)
                  );

                  在本例中,description 列的最大长度是10个字符。对于NCHAR列的最大大小,不可能使用字节长度,执行不成功,如下所示:

                    CREATE TABLE nchar_demo (
                    description NCHAR(10 BYTE) -- not possible
                    );

                    NCHAR列的最大字节长度取决于当前的国家字符集。它是每个字符中最大字符长度和最大字节数的乘积。

                    要查找当前的国家字符集,请使用以下语句:

                      SELECT
                      *
                      FROM
                      nls_database_parameters
                      WHERE
                      PARAMETER = 'NLS_NCHAR_CHARACTERSET';

                      执行上面查询语句,得到类似下面的结果:

                      AL16UTF16字符集使用2个字节存储一个字符,所以description 列的最大字节长度为20个字节。

                      Oracle将NCHAR列的最大长度限制为2000字节。这意味着一个NCHAR列只能容纳2000字符的1字节字符或1000个字符的2字节字符。
                      NCHAR与CHAR比较/区别




                      首先,NCHAR的最大长度只在字符长度语义上,而CHAR的最大长度可以是字符长度或字节长度语义。
                      其次,NCHAR将字符存储在国家默认字符集中,而CHAR将字符存储在默认字符集中。

                      以下语句返回由CHAR使用的默认字符集和由NCHAR使用的默认国家字符集:

                        SELECT
                        *
                        FROM
                        nls_database_parameters
                        WHERE
                        PARAMETER IN(
                        'NLS_CHARACTERSET',
                        'NLS_NCHAR_CHARACTERSET'
                        );

                        执行上面查询语句,得到以下结果(因环境不同而不同):

                        注意:NCHAR和CHAR之间是不能直接互相兼容的,而是要通过Oracle的函数或者语法进行转换,比如说从NCHAR转成CHAR是要用TO_CHAR函数进行转换,而CHAR转换为NCHAR,比如说'ABCDE'这个CHAR字符串,则要通过N'ABCDE'来进行表示,也就是说前面要有一个N这个特殊字符,表示是NCHAR类型。

                        点击关注“SQL数据库运维”,后台或浏览至公众号文章底部点击“发消息”回复关键字:进群,带你进入高手如云的技术交流群。后台回复关键字:SQL,获取学习资料。


                        动动小手点击加关注呦☟☟☟

                        文章转载自SQL数据库运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论