You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JS+Spring开发时输入连字符存入Oracle变为问号如何解决?

问题根因

你遇到的是非ASCII字符全链路编码不匹配+前端代码bug共同导致的问题,具体如下:

1. 前端替换逻辑完全失效

你写的denominacionComercial.replace('–','-')是错误写法:JavaScript的String.replace()方法不会修改原字符串,只会返回替换后的新字符串,你没有把返回值赋值回原变量,所以长破折号(en dash,Unicode U+2013的–)根本没有被替换成普通ASCII短横(ASCII 45的-),非ASCII字符被直接提交到了后端。
修改方案:把对应代码改为:

if(denominacionComercial.includes('–')){ 
    denominacionComercial = denominacionComercial.replace('–','-');
    console.log("DESPUÉS " + denominacionComercial);
}

你可以直接看控制台的DESPUÉS输出,就能确认替换之前没有生效。

2. 全链路字符集不统一

没有被替换的长破折号属于多字节Unicode字符,只要前端、Spring服务、数据库连接、Oracle数据库任意一个环节的字符集不兼容UTF-8,就会被转成乱码¿。

排查修复步骤

  • 前端页头确保配置了<meta charset="UTF-8">,保证请求提交时用UTF-8编码
  • Spring配置文件添加强制UTF-8编码配置:
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
  • 检查Oracle JDBC连接串,补充UTF-8编码参数:
jdbc:oracle:thin:@//你的数据库地址:端口/服务名?useUnicode=true&characterEncoding=UTF-8
  • 确认Oracle数据库字符集支持UTF-8,执行SQL查询:
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';

如果返回结果不是AL32UTF8,说明数据库本身不支持存储多字节Unicode字符,需要调整数据库字符集。

  • 可以在Spring Controller接收参数时打印日志,如果此时参数已经是乱码,说明问题出在前端到Spring的链路;如果参数正常,说明问题出在Spring到数据库的链路,快速缩小排查范围。

内容的提问来源于stack exchange,提问作者okjfokjrf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:36:03