Java JPA:重音字符另存为?在数据库中
我们的应用程序运行在weblogic 10g上,并通过默认eclipselink实现支持的JPA将数据持久化到oracle 9数据库中 实体很简单:Java JPA:重音字符另存为?在数据库中,java,jpa,jdbc,internationalization,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 impleme
@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设置(与另一个应用程序数据库非常相似)
编辑2:
WebLogic/数据源
“连接池”选项卡具有以下属性:
URL: jdbc:oracle:thin:@hostname:1521:SID
Driver: oracle.jdbc.xa.client.OracleXADataSource
Oracle选项卡:所有内容都未选中查看原始字符串和存储字符串,模式是所有>0x7f的字符都存储为0x3f(63)。这是转换为US-ASCII(或其他没有字节0x80-0xff代码点的字符集)的典型转换 这肯定是某个地方的字符编码问题。您指定的未编码字符不在ISO-8859-2中,ISO-8859-2是您为其配置NLS的字符集 您可以尝试ISO-8859-1(WE8ISO8859P1),例如法语为法语。WE8ISO8859P1(或捷克语为捷克语。如果您想将语言保留为捷克语,请尝试使用WE8ISO8859P1)。WE8MSWIN1252比8859-1更完整
如果您的数据库支持捷克共和国.UTF8,您也可以使用它。如果它可能是数据库中的问题。oracle数据库默认不支持重音字符。您必须转到数据库运行此“从NLS_数据库_参数中选择* 如果将NLSèU语言设置为AMERICAN,则表中不能有特殊字符(é、è、è等) 要解决这个问题, 在windows中:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_O10R2\NLS_LANG=FRENCH_FRANCE.WE8MSWIN1252
在Linux中:设置NLS_LANG=FRENCH_FRANCE.WE8PC850好的,它最终会工作。你们都是对的,这是语言环境的问题。尽管如此,这是weblogic问题,而不是数据库问题。我尝试了在同一个数据库的不同weblogic上运行的示例代码,结果运行顺利。然后我比较了shell环境和正确的weblogic设置为UTF-8。当我向setDomainEnv.sh添加以下行并重新启动weblogic时,它开始正常工作。谢谢你的帮助
export LANG=en_US.utf8
在存储数据之前,如何设置数据的值?您的表/db排序规则设置为什么?您是否能够在连接属性中设置字符编码?如果是,它设置为什么?数据是通过setter设置的,它的内容在持久化之前是有效的。我不以任何方式操纵连接。我只是让应用服务器设置EntityManager。如果您将字符集设置为WE8ISO8859P1(即ISO-8859-1),它是否有效?数据中未正确编码的字符实际上不在EE8ISO8859P2(ISO-8859-2)中。我同意你的看法。但我不知道它发生在哪里,如何避免。其他应用程序以相同的方式实现和部署,并且工作正常。这对我来说是个谜。您的评论排除了应用程序逻辑中的问题以及排序问题。它必须是连接设置,或者EclipseLink(我从未使用过)正在进行某种转换。您的数据库连接字符串/设置是什么(不要发布您的主机、用户名或密码)?在哪里?在数据库SID中?数据库/weblogic?的外壳环境取决于您的平台。它们都是在我在另一台机器(linux)上运行代码时描述的,并且还可以。我必须在周一调查这台本地机器和客户机器之间的差异。一个是显而易见的:HP-UX。我祈祷这将是weblogic外壳环境,因为我不能触摸数据库。他的原始数据中的重音字符也将被WE8ISO8859P1覆盖;实际上,他目前的套装EE8ISO8859P2中没有这些。
export LANG=en_US.utf8