【问题标题】:Comparing strings that contain accents in SQLite for Java doesn't work在 SQLite for Java 中比较包含重音符号的字符串不起作用
【发布时间】:2013-01-05 06:43:25
【问题描述】:

我在一个文件中读取一些保龄球运动员的名字,然后我需要在 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”输出没有相关平均数的名称,这意味着在数据库中没有找到这些球员。以这种方式输出的所有名称都包含重音符号,并且没有成功解析包含重音符号的名称。

【问题讨论】:

  • 您使用的是哪个 Java Sqlite 驱动程序?
  • @Thilo 我正在使用 sqlitejdbc-v056
  • 也许你可以试试另一个?像这个(如果可能的话,我理解它会包装原生库):bitbucket.org/xerial/sqlite-jdbc/downloads
  • @Thilo 谢谢。我刚试过,但我有同样的问题

标签: java string encoding sqlite


【解决方案1】:

UPPER 只处理 ASCII 字符。

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

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

【讨论】:

  • +1。 UPPER 应该去。但这并不能解释为什么它可以在 SQLite Manager 中工作。并且 UPPER 可能不是大写重音字符,但如果它保持原样(它应该),它可能仍然有效(有点)
  • 工作查询类似于WHERE UPPER(Name) = 'SOMé NAMé'
  • 我会看看那个。但就像 Thilo 说的,同样的查询在 SQLite Manager 中工作是很奇怪的
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多