JPA:重音字符保存为?在数据库中

时间:2013-08-16 09:00:55

标签: java jpa jdbc internationalization

我们的应用程序在weblogic 10g上运行,并通过默认的eclipselink实现支持的JPA将数据保存到oracle 9数据库中。

实体很简单:

@Entity
@Table(name="PLUGINDATA")
@SequenceGenerator(name="plugin_seq", sequenceName="PLUGINDATASEQ", initialValue = 1000, allocationSize = 50)
public class PluginData implements Serializable {
    @Column(name = "data", length = 4000, nullable = false)
    private String data;

@PersistenceContext(unitName = "XYZ")
protected javax.persistence.EntityManager entityManager;

entityManager.persist(entity);

当我传递包含重音字符的字符串时,它们在EJB中是可以的:

83, 116, -59, -103, 101, 100, 111, -60, -115, 101, 115, 107, -61, -67, 32, 107, 114, 97, 106

但它们在数据库中存储已损坏:

83, 116, 63, 63, 101, 100, 111, -60, 63, 101, 115, 107, 63, 63, 32, 107, 114, 97, 106

e.g。重音字符替换为问号:St??edo�?esk?? kraj

我不明白,代码没问题,数据源设置与其他正常工作的应用程序相同。有什么想法吗?

编辑1:

这是SID NLS设置(与其他应用程序数据库非常相似)

select DECODE(parameter, 'NLS_CHARACTERSET', 'CHARACTER SET', 'NLS_LANGUAGE', 'LANGUAGE', 'NLS_TERRITORY', 'TERRITORY') name, value 
from v$nls_parameters
where parameter in ('NLS_CHARACTERSET', 'NLS_LANGUAGE', 'NLS_TERRITORY');

LANGUAGE    ENGLISH
TERRITORY   CZECH REPUBLIC
CHARACTER SET   EE8ISO8859P2

编辑2:

WebLogic /数据源

连接池选项卡具有以下属性:

URL: jdbc:oracle:thin:@hostname:1521:SID 
Driver: oracle.jdbc.xa.client.OracleXADataSource

Oracle标签:一切都未选中

3 个答案:

答案 0 :(得分:1)

如果它可能是数据库中的问题。 oracle数据库不支持默认的重音字符。你必须去你的数据库运行这个“select * from NLS_DATABASE_PARAMETERS;”

如果您将NLS_LANGUAGE设置为AMERICAN,则表格中不能包含特殊字符(é,è,ê等...)

解决此问题

在Windows中:HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ KEY_O10R2 \ NLS_LANG = FRENCH_FRANCE.WE8MSWIN1252

在Linux中:设置NLS_LANG = FRENCH_FRANCE.WE8PC850

答案 1 :(得分:0)

查看原始字符串与存储字符串,模式是所有字符> 0x7f存储为0x3f(63)。这是转换为US-ASCII(或其他一些没有字节0x80-0xff的代码点的字符集)的典型情况。

这肯定是某个地方的字符编码问题。您指定的未编码的字符不在ISO-8859-2中,这是您为NLS配置的字符集。

您可以尝试使用ISO-8859-1(WE8ISO8859P1),例如FRENCH_FRANCE.WE8ISO8859P1(如果你想把语言保持为捷克语,则为CZECH_CZECH REPUBLIC.WE8ISO8859P1)。 WE8MSWIN1252比8859-1更完整。

如果你的数据库支持它,你也可以做CZECH_CZECH REPUBLIC.UTF8。

答案 2 :(得分:0)

好的,它终于有效了。你们都是对的,这是区域问题。尽管如此,这是weblogic问题,而不是数据库。我尝试在不同的weblogic上运行的示例代码与同一个数据库运行顺利。然后我比较了shell环境和正确的weblogic将LANG设置为UTF-8。当我将以下行添加到setDomainEnv.sh并重新启动weblogic时,它开始正常工作。谢谢你的帮助。

export LANG=en_US.utf8