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

标签 java string encoding sqlite

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

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

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

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

此外,如果我在 SQLite 管理器中运行我的查询,一切都很好,这实际上让我非常确定我需要使用 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”输出没有关联平均数的名字,这意味着这些球员还没有在数据库中找到。以这种方式输出的所有名称都包含重音符号,并且没有成功解析包含重音符号的名称。

最佳答案

UPPER仅处理 ASCII 字符。

在搜索玩家名称时应确保其大小写一致。 (您的代码已经假定拼写、名称顺序、首字母等是一致的。)

(当两个玩家同名时会发生什么?)

关于java - 在 SQLite for Java 中比较包含重音符号的字符串不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14451725/

相关文章:

java - onCheckedChangeListener 不适用于 Android Studio

javascript - JavaScript 中的 UTF-8 花式文本转字母数字

encoding - 二进制积分数据压缩

java - 带有用户名和密码输入的 JOptionPane

Java 帮助 25% 的时间

java - 如何在 Spring+JSF 应用程序中使用 JSF 注解

JavaScript 全局 boolean 变量将自身转换为字符串

string - 无法将类型 'Range<Int>' 的值转换为预期的参数类型 'Range<Index>'(又名 'Range<String.CharacterView.Index>')

mysql - LuaLaTeX - 字符串包含无效的 utf-8 序列

python - 关于 Mac OS X Lion 上的 Apache