Oracle中字段长度分为两种:一种是字节(BYTE)长度,另一种是字符(CHARACTER)长度。

比如在一个字段里存储这样两个字符:一个汉字和一个英文字母。用字节长度来计算的话,那就是3 bytes;如果用字符长度来计算的话,那就是2 characters。设想一个自助新闻发布系统,假如用varchar2来存储正文并且需要限制正文长度,该怎么做?直接用varchar2 (2000)么?事实上这样的话我们可能会发现,正文长度会被限制在1000或者更少的字符数。这是由于各种文字的编码长度不同所致,有的是单字节,有的 是双字节,有的可能是三个字节。程序员很可能得自己写个函数来控制字符数。

事实上,Oracle可以很方便的达到你的目的。先看一个简单的实验:

SQL> create table zeeno (text varchar2(10 char));

Table created.

SQL> insert into zeeno values('hi,对我喊万岁');

1 row created.

再使用BYTE看看:

SQL> create table zeeno (text varchar2(10 byte));

Table created.

SQL> insert into zeeno values('hi,对我喊万岁');
insert into zeeno values('hi,对我喊万岁')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."ZEENO"."TEXT" (actual: 13,
maximum: 10)

SQL> drop table zeeno;

Table dropped.

SQL> show parameter nls_l

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_language string SIMPLIFIED CHINESE
nls_length_semantics string BYTE

你也可以通过设置nls_length_semantics参数来修改数据库的默认属性。

系统环境:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production