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

Spring JDBC查询无结果,SQL Developer执行同语句却返回数据

问题排查与解决方案

可能的原因及对应解决方法

1. 特殊字符/编码不匹配

大概率是请求参数的字符编码异常,比如数据库中实际存储的是带变音的KÖLUNG,但URL传参时Ö被错误转义或编码,导致JDBC传入的KOELUNG(纯大写字母O)和数据库值不匹配——而SQL Developer中你直接输入了正确的带变音字符,所以能查到结果。

解决步骤:

  • 在方法开头添加日志,打印接收到的kurztext实际值和字节编码,确认参数是否正确:
    import java.nio.charset.StandardCharsets;
    import java.util.Arrays;
    
    public Standardtexte getStandardtexte(String kurztext) {
        // 新增日志排查
        System.out.println("接收到的kurztext: " + kurztext);
        System.out.println("UTF-8字节编码: " + Arrays.toString(kurztext.getBytes(StandardCharsets.UTF_8)));
        
        Standardtexte standardtexte = new Standardtexte();
        standardtexte.kurztext = kurztext;
        standardtexte.schluessel = jdbc.query("select schluessel, langtext from hb_standardtexte where kurztext = ?", (rs, rowNum) -> {
            Schluessel s = new Schluessel();
            s.schluessel = StringUtils.trimToEmpty(rs.getString(1));
            s.langtext = StringUtils.trimToEmpty(rs.getString(2));
            return s;
        }, kurztext);
        return standardtexte;
    }
    
  • 确保数据库连接URL指定了正确的字符编码:
    • Oracle:在连接URL中添加?useUnicode=true&characterEncoding=UTF-8,同时检查数据库的NLS_CHARACTERSET设置。
    • MySQL:连接URL添加?useUnicode=true&characterEncoding=UTF-8。

2. 数据库排序规则/大小写敏感性差异

部分数据库的排序规则会区分字符的特殊格式(比如变音符号),JDBC连接的会话参数可能和SQL Developer不一致,导致匹配失败。

解决方法:

  • 修改查询语句,强制统一字符匹配规则,比如使用UPPER或NORMALIZE函数(Oracle支持NORMALIZE处理变音):
    -- Oracle示例:标准化字符后匹配
    select schluessel, langtext from hb_standardtexte where NORMALIZE(kurztext) = NORMALIZE(?)
    -- 或统一转为大写
    select schluessel, langtext from hb_standardtexte where UPPER(kurztext) = UPPER(?)
    
  • 对比SQL Developer和JDBC的会话参数:在SQL Developer中执行SELECT * FROM NLS_SESSION_PARAMETERS,查看NLS_COMP、NLS_SORT等参数,确保JDBC连接时设置相同的参数(可通过JDBC连接属性指定)。

3. 字段类型与参数的隐式转换问题

如果数据库中kurztext字段是CHAR类型,会自动填充空格,而JDBC传入的是VARCHAR类型的参数,可能导致匹配失败。

解决方法:

  • 修改查询语句,使用TRIM函数消除空格影响:
    select schluessel, langtext from hb_standardtexte where TRIM(kurztext) = TRIM(?)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:57:15