【问题标题】:Varchar2(CHAR) always in PLSQL?Varchar2(CHAR) 总是在 PLSQL 中?
【发布时间】:2015-06-25 09:37:13
【问题描述】:

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

考虑一个变量:

l_str varchar2(10 BYTE);

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

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

l_str varchar2(10 CHAR);

或者换一种说法,有什么理由应该在PLSQL中使用varchar2(10 byte)varchar2(10)

编辑:我能想到使用byte 的唯一原因是,如果您确定存储的字符需要多少字节。因此,在这种情况下,您将分配更少的内存。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    根据字符集的不同,我认为您最终只能获得一半的空间,例如使用更严格的字符集。文档证实了这一点

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

    id VARCHAR2(32 BYTE)

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

    名称 VARCHAR2(32 CHAR)

    名称列包含数据库字符集中的数据。如果数据库字符集允许多字节字符,那么这32个字符可以存储为32个字节以上。

    【讨论】:

    • id VARCHAR2(32 BYTE) 如果您将数据库移动到utf16 之类的字符编码,则会出现问题。
    【解决方案2】:

    我有 Oracle 11g 的 AL32UTF8 字符集。 Oracle 存储不同长度的字节和字符数据。例如--

    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 列,其中对于字节数据类型,它的值是 1,对于字符,它的值是 4。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 2019-06-29
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多