【发布时间】:2013-08-16 09:00:54
【问题描述】:
我们的应用程序在 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
例如重音字符替换为问号: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 选项卡:一切都未选中
【问题讨论】:
-
在存储之前如何设置
data的值?您的表/数据库排序规则设置为什么?你有能力在连接属性中设置字符编码吗?如果是这样,它设置为什么? -
数据是通过setter设置的,其内容在persist之前有效。我不以任何方式操纵连接。我只是让应用服务器设置EntityManager。
-
如果将字符集设置为 WE8ISO8859P1(即 ISO-8859-1)是否有效?数据中未正确编码的字符实际上不在 EE8ISO8859P2 (ISO-8859-2) 中。
标签: java jpa jdbc internationalization