• oracle官方文档- length篇


    一.首先介绍下单字节字符集 多字节字符集

    2.2字符编码方案
    2.2.1 单字节编码
        (1)单字节7位字符集,可以定义128个字符,最常用的字符集为 US7ASCII
        (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家
        例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码 )
    2.2.2 多字节编码
        (1)变长多字节编码
         某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,   例如日语、汉语、印地语等
        例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280
        (2)定长多字节编码
        每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集
    2.2.3 unicode 编码
        Unicode 是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。
        UTF-8 是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集

    转载一个帖子,写的非常好 http://blog.itpub.net/16179598/viewspace-663045/

     

     

    二.介绍下单字节字符集 和 多字节字符集

    单字节字符集是  WE8ISO8859P1,WE8ISO8859P1是单字节8位字符集

     

    多字节字符集是  AL32UTF8。,AL32UTF8是变长多字节编码。

    ZHS16GBK

     

    在WE8ISO8859P1字符集下,一个汉字占了1个字节,一个字符 占了1个字节;

    在AL32UTF8字符集下,一个汉字占了3个字节,一个字符 占了1个字节

    在ZHS16GBK字符集下, 一个汉字占了2个字节。一个字符 占了1个字节

    2.1 WE8ISO8859P1字符集

    SQL> select vsize('汉') from dual;

     

     VSIZE('?')

    -----------

              1

     

    SQL> select vsize('A') from dual;

     

     VSIZE('A')

    -----------

              1

     

    SQL> select lengthb('汉') from dual;

     

     LENGTH('?')

    ------------

               1

    2.2 AL32UTF8字符集

    SQL> select vsize('汉') from dual;

     

     VSIZE('汉')

    -----------

              3

    SQL> select vsize('A') from dual;

     

     VSIZE('A')

    -----------

              1

     

    SQL> select lengthb('汉') from dual;

     

     LENGTH('?')

    ------------

               3

    2.3 ZHS16GBK字符集

    SQL> select vsize('汉') from dual;

     

     VSIZE('汉')

    -----------

              2

     

    SQL> select vsize('A') from dual;

     

     VSIZE('A')

    -----------

              1

     

    SQL> select lengthb('汉') from dual;

     

     LENGTH('汉')

    ------------

               2

    三. 测试结果

    3.1 WE8ISO8859P1字符集-测试结果

    建立下面的表:

    create table t_test_var

    (

    v_char2 char(2),

    v_char3 char(3),

    v_varchar22 varchar2(2),

    v_varchar23 varchar2(3),

    v_varchar2 varchar(2),

    v_varchar3 varchar(3),

    v_nvarchar22 nvarchar2(2),

    v_nvarchar23 nvarchar2(3)

    );

     

    然后分别在两个数据库中插入测试数据:

    Server1:

    SQL> insert into t_test_var values ('我','我','我','我','我','我','我','我');

     

    1 row inserted

     

    SQL> insert into t_test_var values ('我们','我们','我们','我们','我们','我们','我们','我们');

     

    1 row inserted

    SQL> insert into t_test_var values ('我们是','我们是','我们是','我们是','我们是','我们是','我们是','我们是');

     

    insert into t_test_var values ('我们是','我们是','我们是','我们是','我们是','我们是','我们是','我们是')

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_CHAR2" (actual: 3, maximum: 2)

     

    说明WE8ISO8859P1字符集环境下char用一个字节来存储一个汉字,即:一个汉字占用一个字节

     

    修改一下最后一条插入语句,使得char类型不越界:

     

    SQL> insert into t_test_var values ('我们','我们是','我们是','我们是','我们是','我们是','我们是','我们是');

     

    insert into t_test_var values ('我们','我们是','我们是','我们是','我们是','我们是','我们是','我们是')

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_VARCHAR22" (actual: 3, maximum: 2)

     

    说明WE8ISO8859P1字符集环境下varchar2类型也是一个字节存储一个汉字

     

    再次修改:

    SQL> insert into t_test_var values ('我们','我们是','我们','我们是','我们是','我们是','我们是','我们是');

     

    insert into t_test_var values ('我们','我们是','我们','我们是','我们是','我们是','我们是','我们是')

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_VARCHAR2" (actual: 3, maximum: 2)

    说明WE8ISO8859P1字符集环境下varchar也是一个汉字占一个字节存储空间,

     

    继续修改:

     

    SQL> insert into t_test_var values ('我们','我们是','我们','我们是','我们','我们是','我们是','我们是');

     

    insert into t_test_var values ('我们','我们是','我们','我们是','我们','我们是','我们是','我们是')

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_NVARCHAR22" (actual: 3, maximum: 2)

    说明WE8ISO8859P1字符集环境下nvarchar2也是一个汉字占一个字节存储空间。

     

    这是因为在WE8ISO8859P1字符中,根本没有汉字编码。所以得出以上的实验结果。

    3.2 AL32UTF8字符集-测试结果

    建立下面的表:

    create table t_test_var

    (

    v_char2 char(9),

    v_char3 char(9),

    v_varchar22 varchar2(9),

    v_varchar23 varchar2(9),

    v_varchar2 varchar(9),

    v_varchar3 varchar(9),

    v_nvarchar22 nvarchar2(9),

    v_nvarchar23 nvarchar2(9)

    );

     

    插入测试数据:

     

    SQL> insert into t_test_var values ('我','我','我','我','我','我','我','我');

     

    SQL> insert into t_test_var values ('我们','我们','我们','我们','我们','我们','我们','我们');

      

     

    SQL> insert into t_test_var values ('我们是','我们是','我们是','我们是','我们是','我们是','我们是','我们是');

     

    SQL> insert into t_test_var values ('我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

     

    insert into t_test_var values ('我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_CHAR2" (actual: 12, maximum: 9)

     

    说明AL32UTF8字符集环境下char用三个字节来存储一个汉字,即:一个汉字占用三个字节,四个汉字需要占用12个字节

     

    修改一下最后一条插入语句,使得char类型不越界:

     

    SQL> insert into t_test_var values ('我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

     

    insert into t_test_var values ('我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_CHAR3" (actual: 12, maximum: 9)

     

    说明AL32UTF8字符集环境下char用三个字节来存储一个汉字,即:一个汉字占用三个字节,四个汉字需要占用12个字节

     

     

    再次修改:

    SQL> insert into t_test_var values ('我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    insert into t_test_var values ('我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_VARCHAR22" (actual: 12, maximum: 9)

    说明AL32UTF8字符集环境下char用三个字节来存储一个汉字,即:一个汉字占用三个字节,四个汉字需要占用12个字节

     

     

    继续修改:

     

    SQL> insert into t_test_var values ('我们是','我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    Insert into t_test_var values ('我们是','我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_NVARCHAR22" (actual: 3, maximum: 2)

     

    说明AL32UTF8字符集环境下char用三个字节来存储一个汉字,即:一个汉字占用三个字节,四个汉字需要占用12个字节

     

    这是因为在AL32UTF8字符集中,根本没有汉字编码。所以得出以上的实验结果。

    3.3 ZHS16GBK字符集-测试结果

    建立下面的表:

    create table t_test_var

    (

    v_char2 char(6),

    v_char3 char(6),

    v_varchar22 varchar2(6),

    v_varchar23 varchar2(6),

    v_varchar2 varchar(6),

    v_varchar3 varchar(6),

    v_nvarchar22 nvarchar2(6),

    v_nvarchar23 nvarchar2(6)

    );

     

    插入测试数据:

     

    SQL> insert into t_test_var values ('我','我','我','我','我','我','我','我');

     

    SQL> insert into t_test_var values ('我们','我们','我们','我们','我们','我们','我们','我们');

      

     

    SQL> insert into t_test_var values ('我们是','我们是','我们是','我们是','我们是','我们是','我们是','我们是');

     

     

    SQL> insert into t_test_var values ('我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

     

    insert into t_test_var values ('我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_CHAR2" (actual: 8, maximum: 6)

     

    说明ZHS16GBK字符集环境下char用两个字节来存储一个汉字,即:一个汉字占用两个字节,四个汉字需要占用8个字节

     

    修改一下最后一条插入语句,使得char类型不越界:

     

    SQL> insert into t_test_var values ('我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

     

    insert into t_test_var values ('我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_CHAR3" (actual: 8, maximum: 6)

     

    说明ZHS16GBK字符集环境下char用两个字节来存储一个汉字,即:一个汉字占用两个字节,四个汉字需要占用8个字节

     

     

    再次修改:

    SQL> insert into t_test_var values ('我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    insert into t_test_var values ('我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_VARCHAR22" (actual: 12, maximum: 9)

     

    说明ZHS16GBK字符集环境下VARCHAR用两个字节来存储一个汉字,即:一个汉字占用两个字节,四个汉字需要占用8个字节

     

     

    继续修改:

     

    SQL> insert into t_test_var values ('我们是','我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    Insert into t_test_var values ('我们是','我们是','我们是','我们是的','我们是的','我们是的','我们是的','我们是的');

     

    ORA-12899: value too large for column "TEST"."T_TEST_VAR"."V_NVARCHAR23" (actual: 3, maximum: 2)

     

    说明ZHS16GBK字符集环境下NVARCHAR用两个字节来存储一个汉字,即:一个汉字占用两个字节,四个汉字需要占用8个字节

     

     

    LENGTH

    Syntax

    length::=


    Description of the illustration length.gif

    Purpose

    The LENGTH functions return the length of char. LENGTH calculates length using characters as defined by the input character set. LENGTHB uses bytes instead of characters. LENGTHC uses Unicode complete characters. LENGTH2 uses UCS2 code points. LENGTH4 uses UCS4 code points.

    char can be any of the data types CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB. The exceptions are LENGTHC, LENGTH2, and LENGTH4, which do not allow char to be a CLOB or NCLOB. The return value is of data type NUMBER. If char has data type CHAR, then the length includes all trailing blanks. If char is null, then this function returns null.

    Restriction on LENGTHB The LENGTHB function is supported for single-byte LOBs only. It cannot be used with CLOB and NCLOB data in a multibyte character set.

    Examples

    The following example uses the LENGTH function using a single-byte database character set:

    SELECT LENGTH('CANDIDE') "Length in characters"

      FROM DUAL;

     

    Length in characters

    --------------------

                       7

    The next example assumes a double-byte database character set.

    SELECT LENGTHB ('CANDIDE') "Length in bytes"

      FROM DUAL;

     

    Length in bytes

    ---------------

                 14

  • 相关阅读:
    Ninject Lazy Load问题
    log4net 极简配置
    log4net 使用指南,最常遇到的问题整理。。。
    【应聘】阿里巴巴Java面试题目
    【Unity3D】自动寻路(Nav Mesh Agent组件)
    【unity3D】鼠标控制camera的移动、放大(俯视浏览效果、LOL摄像机移动效果)
    【Unity3D】枪战游戏—弹孔设置
    【Unity3D】枪战游戏—发射子弹、射线检测
    【Unity3D】Unity自带组件—完成第一人称人物控制
    软件工程【第5章】- 需求工程与需求设计
  • 原文地址:https://www.cnblogs.com/iyoume2008/p/5181895.html
Copyright © 2020-2023  润新知