gpt4 book ai didi

java - 使用 Oracle 12c 和 ojdbc7/ojdbc8 驱动程序时出现无效字符

转载 作者:行者123 更新时间:2023-12-02 02:20:54 24 4
gpt4 key购买 nike

通过 Oracle 12c 数据库中的 REST API 保存数据后,从数据库中选择数据时,无法识别特殊字符(它们显示为奇怪的字符)。

可能是Oracle数据库配置问题?我将在此处添加所有数据:

  • Oracle 版本:12.1.0.2.0
  • Java 驱动程序版本:ojdbc7-12.1.0.1.jar(最新可用)
  • Java 版本:JDK 8u162(最新可用)
  • 应用服务器:WildFly 9.0.1

如果我们将驱动程序降级到 OJDBC 6,它适用于数据库中已存在的某些字符。

我们还将 orai18n.jar 驱动程序添加到 JBoss 类路径中,但没有任何更改。

Oracle 数据库 NLS 配置

enter image description here

发布

使用 JSON 负载进行非常简单的后期操作:

enter image description here

获取

插入数据库后,我们得到了数据,但看不到特殊字符:

enter image description here

更新:我添加了另一列类型为 NVARCHAR2 的列,得到了响应:

enter image description here

代码

我们使用简单的 REST 服务类隔离了这个简单项目中的问题。我们认为 Hibernate 可能是原因,但我们实现了纯 JDBC API,并且得到了相同的结果。

@Path("/parameter")
@Stateless
public class ParameterResource {

@PersistenceContext
private EntityManager em;

@POST
public void post(Parameter p) throws Exception {
System.out.println("Value on POST: " + p.getValue());
em.persist(p);
}

@GET
@Path("/{id}")
public Parameter get(@PathParam("id") String id) throws Exception {
Parameter p = em.find(Parameter.class, id);
System.out.println("Value on GET: " + p.getValue());
return p;
}

}

表 DDL 如下:

Name   Null?    Type
------ -------- --------------
ID NOT NULL VARCHAR2(20)
VALUE VARCHAR2(200)
VALUEN NVARCHAR2(200)

控制台输出如下,因此 REST API 应该没有问题,因为数据似乎在数据库接口(interface)处“损坏”:

enter image description here

甚至添加了一个过滤器来确保我们在 Web 服务中来回使用正确的编码。

@WebFilter("myFilter")
public class MyFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}

@Override
public void destroy() {
}

}

SQL 开发人员

使用 SQL Developer 时也会出现此问题,它恰好在 Java 上运行并使用 OJDBC 8 驱动程序进行连接。

enter image description here

最佳答案

您的数据库是 US7ASCII 数据库。因此,您可以在 VARCHAR2 列中存储的唯一字符是 ASCII 字符。对于非 ASCII 字符,您必须使用 NVARCHAR2 列。我非常怀疑这是否适用于旧版本的 JDBC 驱动程序,或者您可能使用的是具有其他字符集(例如 UTF8)的不同数据库。

关于java - 使用 Oracle 12c 和 ojdbc7/ojdbc8 驱动程序时出现无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com