如果数据库使用utf8
作为字符集,那么将varchar2与字节语义一起使用是否有意义?
考虑一个变量:
l_str varchar2(10 BYTE);
如果我稍后根据将返回10 char
列内容的查询为其分配值,我无法知道这些字符将占用多少字节,utf8
可能是每个字符超过一个字节。
因此,当使用多字节字符集时,我不应该总是使用以下内容吗?
l_str varchar2(10 CHAR);
或者换句话说,有没有理由在PLSQL中使用varchar2(10 byte)
或varchar2(10)
?
编辑:我能想到使用byte
的唯一原因是你知道存储的字符需要多少字节。所以在这种情况下,您将分配更少的内存。
答案 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列说明。