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

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

oracle官方文档- length篇的更多相关文章

  1. Oracle官方文档在线查看

    1.9i Oracle官方文档在线查看 http://www.oracle.com/pls/db92/homepage 2.10g Oracle官方文档线查看 http://www.oracle.co ...

  2. Oracle 官方文档地址

    官方文档地址: https://docs.oracle.com/cd/E11882_01/index.htm

  3. centos7安装oracle11g(根据oracle官方文档安装,解决图形界面安装问题)

    一.系统及安装包 操作系统:centos 7.4 oracle版本:oracle 11g r2 二.centos环境配置 安装数据库所需要的软件包 [root@localhost data]# yum ...

  4. oracle官方文档的阅读方法

    Concept 包含了 oracle 数据库里面的一些基本概念和原理, 比如 数据库逻辑结构, 物理结构, 实例结构, 优化器, 事务等. PDF 460页 Reference 包含了动态性能视图, ...

  5. 如何查看 oracle 官方文档

    Concept 包含了 oracle 数据库里面的一些基本概念和原理, 比如 数据库逻辑结构, 物理结构, 实例结构, 优化器, 事务等. PDF 460页 Reference 包含了动态性能视图, ...

  6. [置顶] 阅读Oracle官方文档指南

    还在整理中.... EXPDP/IMPDP 相关文档:Utilities 2 Data Pump Export 3 Data Pump Import SQL*Loader 相关文档:Utilities ...

  7. oracle官方文档_查看初始化參数(举例)

    原创作品,出自 "深蓝的blog" 博客.深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46864217 记录 ...

  8. oracle官方文档12c对应关系

    ADDCI Oracle® Database Data Cartridge Developer's Guide 12c Release 1 (12.1) E15882-05 ADFNS Oracle® ...

  9. Oracle官方文档

    Oracle DBA 10g 两日速成课程 http://www.oracle.com/webfolder/technetwork/cn/tutorials/obe/db/10g/r2/2day_db ...

随机推荐

  1. Ubuntu 桌面歌词

    Ubuntu 有个用来显示歌词软件叫 osd-lyrics. 这个软件的强大之处在于他可以和各种播放器配合, 并且可以自动下载歌词. 自从升级到14.04后不能用了,便以为该软件被废弃了. 无意中发现 ...

  2. 【转】Android ROM研究---Android build system增加模块

    原文网址:http://hualang.iteye.com/blog/1141315 Android build system就是编译系统的意思 在我们需要向自己编译的源代码中增加模块的时候,需要一些 ...

  3. JDK 1.6.0和 6.0 有啥区别,JavaTM SE 6 的平台名字和版本号的说明(转)

    一直这么理解,今天才看到官方的解释,真是有点汗颜. 核心就是 6.0用于平台和产品的名字,而1.6.0用于开发者. 他们指的是同一个东西. 原文地址:http://java.sun.com/javas ...

  4. php将SQL查询结果赋值给变量

    2012-03-25 12:12 a786013819 | 分类:数据库DB | 浏览1393次 $sql = "select field1 from pre_common_member_p ...

  5. 《Numerical Methods》-chaper4-一元非线性方程的解

    在许多生产时间问题中,我们根据已知条件往往会列出一个一元非线性方程,一个最典型的例子就是银行存款的问题,由于其利息需要基于前一年的本息和,因此列出来的方程x的指数往往是高次的.还有物理问题当中一系列用 ...

  6. poj 2288 tsp经典问题

    题目链接:http://poj.org/problem?id=2288 #include<cstdio> #include<cstring> #include<iostr ...

  7. Traffic Lights - SGU 103(最短路)

    题目大意:有一个城市的路线图,有N个交叉点,每两个交叉点之间只有一条路,现在想从交点u去交点v,不过这个路的交通比较特别,每个路都有一个交通灯,灯有两种颜色,蓝色和紫色,例如一条路线在交点s,t之间, ...

  8. boost------asio库的使用2(Boost程序库完全开发指南)读书笔记

    网络通信 asio库支持TCP.UDP.ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好地封装了原始的Berkeley Socket Api,展现 ...

  9. CodeIgniter框架url去index.php(转)

    针对apache,支持mode_rewrite可以通过在目录先建立.htaccess去掉url中index.php .htaccess内容如下: RewriteEngine on RewriteCon ...

  10. Qt 学习之路 :菜单栏、工具栏和状态栏

    在之前的<添加动作>一文中,我们已经了解了,Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示.QAction可以添加到菜单上.工具栏上.期间,我们还详细介绍了一 ...