1

ファイル内のボウリング プレーヤーの名前を読み取っています。次に、それらの名前を SQLite データベースで検索して平均を計算する必要があります。

アクセントを含む名前 ("É" など) を除いて、すべてが完全に機能します。

私はPRAGMA EncodingSQLite Manager で使用しており、データベースは UTF-8 でエンコードされています。また、出力することにより、JavaがエンコーディングにUTF-8を使用していることを確認しましたCharset.defaultCharset();

また、クエリを 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」は、関連付けられた平均を持たない名前を出力します。これは、それらのプレーヤーがデータベースで見つからなかったことを意味します。この方法で出力されたすべての名前にはアクセントが含まれており、アクセントを含む名前は正常に解析されません。

4

1 に答える 1

3

UPPERは ASCII 文字のみを処理します。

プレイヤー名を検索するときは、大文字が一貫していることを確認する必要があります。(あなたのコードは、スペル、名前の順序、イニシャルなどが一貫していることを既に前提としています。)

(2 人のプレイヤーが同じ名前の場合はどうなりますか?)

于 2013-01-22T08:37:58.227 に答える