Varchar2(CHAR)总是在PLSQL中?

时间:2015-06-25 09:37:14

标签: oracle plsql

如果数据库使用utf8作为字符集,那么将varchar2与字节语义一起使用是否有意义?

考虑一个变量:

l_str varchar2(10 BYTE);

如果我稍后根据将返回10 char列内容的查询为其分配值,我无法知道这些字符将占用多少字节,utf8可能是每个字符超过一个字节。

因此,当使用多字节字符集时,我不应该总是使用以下内容吗?

l_str varchar2(10 CHAR);

或者换句话说,有没有理由在PLSQL中使用varchar2(10 byte)varchar2(10)

编辑:我能想到使用byte的唯一原因是你知道存储的字符需要多少字节。所以在这种情况下,您将分配更少的内存。

2 个答案:

答案 0 :(得分:1)

根据字符集的不同,我认为您最终只会获得一半的空间,例如更具限制性的设置。文档

确认了这一点

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_sqltypes.htm#sthref367

id VARCHAR2(32 BYTE)

id列仅包含单字节数据,最多32个字节。

名称VARCHAR2(32 CHAR)

name列包含数据库字符集中的数据。如果数据库字符集允许多字节字符,则32个字符可以存储为超过32个字节。

答案 1 :(得分:1)

我在Oracle 11g上有AL32UTF8字符集。 Oracle以不同的长度存储byte和char数据。 e.g .--

create table t1(aa varchar2(1));
create table t2(aa varchar2(1 char));

现在执行 -

select * from ALL_TAB_COLUMNS where table_name in ('T1','T2');

检查DATA_LENGTH列中byte数据类型的位置,其值为1,char表示值为4。

您可以关注this link了解ALL_TAB_COLUMNS列说明。