Oracle11g 如何将字符串列配置为使用';char';作为尺寸单位,而不是';字节';在DataNucleus中

Oracle11g 如何将字符串列配置为使用';char';作为尺寸单位,而不是';字节';在DataNucleus中,oracle11g,jdo,datanucleus,oracle-xe,Oracle11g,Jdo,Datanucleus,Oracle Xe,我使用DataNucleus作为持久层(JDO),并被迫使用Oracle11g作为数据库(使用11gXE进行开发)。不幸的是,自11.2版以来,VARCHAR列的默认长度语义(NLS\u length\u semantics)被设置为byte,而不是char,这意味着所有只提供大小的列都将产生如下类型定义: VARCHAR2(50 byte) 而不是: VARCHAR2(50 char) 从Oracle的角度来看,解决方案有三个方面: 在您的大小定义中声明一个单位(我正试图用JDO元数据实现

我使用DataNucleus作为持久层(JDO),并被迫使用Oracle11g作为数据库(使用11gXE进行开发)。不幸的是,自11.2版以来,
VARCHAR
列的默认长度语义(
NLS\u length\u semantics
)被设置为
byte
,而不是
char
,这意味着所有只提供大小的列都将产生如下类型定义:

VARCHAR2(50 byte)
而不是:

VARCHAR2(50 char)
从Oracle的角度来看,解决方案有三个方面:

  • 在您的大小定义中声明一个单位(我正试图用JDO元数据实现这一点)
  • 在每个会话上更改
    NLS\u LENGTH\u SEMANTICS
    属性
  • 全局更改
    NLS\u LENGTH\u SEMANTICS
    属性(这似乎不适用于“Express Edition”,我已经为此浪费了一整天)
  • 我已经上下搜索了映射和持久性文档,以找到允许我这样做的元数据属性。我可以为列指定
    jdbcType
    sqlType
    ,当然还有
    length
    。但是没有单位


    任何帮助都将不胜感激。

    您可以通过创建表格来完成。因此,id表已经创建,列的数据类型是
    VARCHAR2(50字节)
    您可以尝试迁移到一个新的列,即
    VARCHAR2(50字节)
    @hotfix谢谢您的回答。我知道我可以手工创建一个模式,并以这种方式迁移数据。但是我正在寻找一个通用的解决方案,让
    DataNucleus
    完成所有的工作。我需要它自动工作。那么,如果您的字符串可能超过100字节,为什么不创建一个列作为varchar2(200)呢?@hotfix,因为没有可靠的方法来衡量我可以在该列中存储什么。Unicode字符的范围为2到4个字节。内容是由用户生成的。我理解,但是如果你说你的字符串可以长达100个字符。如果每个字符为4字节,则可以将400设置为长度