在SQLite for Java中比较包含重音的字符串不起作用

时间:2013-01-22 04:44:20

标签: java string encoding sqlite

我正在文件中读一些保龄球员的名字然后我需要在SQLite数据库中找到这些名字以计算他们的平均值。

除了包含重音符号(例如“É”)的名称外,一切都很完美。

我在SQLite Manager中使用了PRAGMA Encoding,数据库以UTF-8编码。我还通过输出Charset.defaultCharset();

确保我的Java使用UTF-8进行编码

另外,如果我在SQLite Manager中运行我的查询,一切都很好,这实际上让我非常确定我需要用JDBC SQLite驱动程序做些什么。我还没有找到一种方法来查看或更改它使用的编码。我甚至不确定这是什么问题。

这是我正在使用的代码:

public double getPlayerAverage(String name, String leagueName){
    PreparedStatement ps = null;
    ResultSet rs = null;
    double average = 0.0;

    try{
        connect();

        ps = conn.prepareStatement("SELECT AVG(Score)Average FROM Scores " +
                " JOIN Players p1 USING (PlayerID) " +
                " WHERE UPPER(Name) = ? AND UPPER(LeagueName) = ? AND Season = '2012-2013' AND Score > -1" +
                " GROUP BY Season, LeagueName, PlayerID; ");

        ps.setString(1, name);
        ps.setString(2, leagueName);

        rs = ps.executeQuery();

        if(rs.next())
        {
            average = rs.getDouble("Average");
        }
        else
        {
            System.out.println(name + " --- " + leagueName);
        }
    }
    catch(SQLException sqle){
        sqle.printStackTrace();
    }
    finally{
        closer(rs, ps);
    }

    return average;
}

“else”输出没有相关平均值的名称,这意味着在数据库中找不到这些玩家。以这种方式输出的所有名称都包含重音符号,并且没有包含重音符号的名称被成功解析。

1 个答案:

答案 0 :(得分:3)

UPPER仅处理ASCII字符。

在搜索时,您应该确保玩家名称具有一致的大小写。 (您的代码已经假设拼写,名称顺序,缩写等是一致的。)

(当两名球员的名字相同时会发生什么?)