SQLite数据库中的奇怪编码:如何使用JDBC检索字符串值?

时间:2016-01-08 10:09:26

标签: java sqlite jdbc encoding character-encoding

我有

    Class.forName("org.sqlite.JDBC");
    Connection conn = DriverManager.getConnection("jdbc:sqlite:cities.db");
    Statement stat = conn.createStatement();

    ResultSet rs = stat.executeQuery("select * from cities;");+

    while (rs.next()) {
        byte[] bytes = rs.getBytes("country");
        String country = new String(bytes, "utf-8");
        System.out.println(country);
    }

    rs.close();
    conn.close();

我的输出显示 ,例如ä,ö,ü。

如果我从命令行运行sqlite3并从那里查询表,那么字符很好......

“pragma编码;”显示utf-8 ......

如果我调试,则字节数组在“ü”...

处有“-127”

如何解决这个问题? 什么可能导致这个问题?

链接到示例SQLite文件(只有一行):

https://www.dropbox.com/s/6nvl737b6picbie/cities.db?dl=0

2 个答案:

答案 0 :(得分:2)

你可以试试

吗?
Class.forName(org.sqlite.JDBC.class.getCanonicalName());
String url = "jdbc:sqlite:";
SQLiteConfig config = new SQLiteConfig();
config.setEncoding(SQLiteConfig.Encoding.UTF8);
Connection conn = DriverManager.getConnection(url, config.toProperties());
Statement stat = conn.createStatement();

ResultSet rs = stat.executeQuery("select * from cities;");+

while (rs.next()) {
    String country = rs.getString("country");
    System.out.println(country);
}

答案 1 :(得分:1)

这里的问题是SQLite数据库包含使用旧的IBM OEM字符集(code page 437)编码的字符,因此'ü'字符编码为0x81。这是Unicode中未使用的字符以及ISO- *和Windows- *字符集的所有(?)。

enter image description here

我能够使用

正确提取“Country”值
$('[data-click="set-message-status"]').on('click', function (e) {
        e.stopPropagation();
        e.preventDefault();

        var status = $(this).attr('data-status');
        var tooltipText = 'Mark as Read';
        if (status == 'read') {
            $(this).removeClass('read');
            //$('.notification-item').find('.media').removeClass('bg-success');
            $(this).attr('data-status', 'unread');
            //$('.notification-item').find('.media').attr('data-status', 'unread');
        } else {
            $(this).addClass('read');
            //$('.notification-item').find('.media').addClass('bg-success');
            $(this).attr('data-status', 'read');
            //$('.notification-item').find('.media').attr('data-status', 'read');
            tooltipText = 'Mark as Unread';
        }
        $(this).tooltip('hide').attr('data-original-title', tooltipText).tooltip('fixTitle');
    });